def _split_state (a_old, o_old, state, q0l, q1l):
# use least-squares to find new parameters
# add new state to end
ns = a_old.shape[0]
no = o_old.shape[1]
A = numpy.zeros((ns+1,ns+1))
O = numpy.zeros((ns+1,no))
A[0:ns,0:ns] = a_old
O[0:ns,:] = o_old
# fill in p ( * | snew2)
A[ns,:] = A[state,:]
# fill in p (q | snew2)
O[ns,:] = O[state,:] # order of these three lines matters
O[ns,q0l] = 0
w2 = numpy.sum (O[ns,:])
O[ns,:] = O[ns,:] / w2
# fill in p (q | snew1)
O[state,q1l] = 0
w1 = numpy.sum(O[state,:])
O[state,:] = O[state,:] / w1
# finally, fill in p( snew1 | *) p ( snew2 | *)
A[:,ns] = A[:,state]
A[:,state] = w1 / (w1+w2) * A[:,state]
A[:,ns] = w2 / (w1++w2) * A[:,ns]
# done
return A,O,ns
# tricky part is the incoming state reallocate by solving linear system
# (we'll call the coefficients M)
# M = numpy.zeros(( ns + no*ns, 2*(ns+1) ))
# b = numpy.zeros( M.shape[0] )
# ri = 0
# def idx (s0, s1): return s0 if s1 == state else ns + s0
# for si in range(ns):
# M[ri,idx(si,state)] = M[ri,idx(si,ns)] = 1
# b[ri] = a_old[si,state]
# ri += 1
# # q1 obs constraint
# print M.shape
# for si in range(ns):
# for qi in range(no):
# print "O[state,qi]", O[state,qi]
# M[ri,idx(si,state)] = O[state,qi]
# M[ri,idx(si,ns)] = O[si,qi]
# print ri, "o_old", state, qi, o_old[state,qi]
# print ri, b[ri]
# b[ri] = o_old[state,qi]
# ri += 1
# # solve
# x,resids,rank,s = linalg.lstsq(M,b)
# print "X", x
# print "RESIDS", resids
# A[:,state] = x[0:ns+1]
# A[:,state] = A[:,state] / numpy.sum(A[:,state])
# A[:,ns] = x[ns+1:]
# A[:,ns] = A[:,ns] / numpy.sum(A[:,ns])
# # finally
# return A,O,ns
评论列表
文章目录