def bp_update_params_new(args): lmds, pis = args.lmds, args.pis vert_parent, vert_children = args.vert_parent, args.vert_children #print pis[0].shape I, T, L = args.X.shape K = args.gamma.shape[0] theta, alpha, beta, gamma, emit_probs, X = (args.theta, args.alpha, args.beta, args.gamma, args.emit_probs, args.X) evidence = args.evidence #evid_allchild(lmds, vert_children) emit_probs_mat = sp.exp(args.log_obs_mat) #emit_probs_mat /= emit_probs_mat.max(axis=2).reshape(I, T, 1) gamma_p = copy.copy(gamma) alpha_p = copy.copy(alpha) beta_p = copy.copy(beta) theta_p = copy.copy(theta) emit_probs_p = copy.copy(emit_probs) theta[:] = args.pseudocount alpha[:] = args.pseudocount beta[:] = args.pseudocount gamma[:] = args.pseudocount emit_probs[:] = args.pseudocount #evidence = evid_allchild(lmds, args.vert_children) ##support = casual_support(pis) emit_sum = sp.zeros(K) for i in xrange(I): vp = vert_parent[i] for t in xrange(T): if i==0 and t==0: gamma += emit_probs_mat[i, t, :]*evidence[i,t,:] Q = emit_probs_mat[i, t, :]*evidence[i,t,:] else: if i == 0: tmp1, tmp2 = sp.ix_(pis[i][-1,t-1,:], emit_probs_mat[i, t, :]*evidence[i,t,:]) tmp = alpha_p * (tmp1*tmp2) #tmp /= tmp.sum() Q = tmp.sum(axis=0) alpha += tmp/tmp.sum() elif t == 0: tmp1, tmp2 = sp.ix_(pis[vp][i-1,t,:], emit_probs_mat[i, t, :]*evidence[i,t,:]) tmp = beta_p *(tmp1*tmp2) Q = tmp.sum(axis=0) beta += tmp/tmp.sum() else: tmp1, tmp2, tmp3 = sp.ix_(pis[vp][i-1,t,:], pis[i][-1, t-1,:], emit_probs_mat[i, t, :]*evidence[i,t,:]) tmp = theta_p *(tmp1*tmp2 *tmp3) Q = (tmp.sum(axis=0)).sum(axis=0) theta += tmp/tmp.sum() Q /= Q.sum() for l in xrange(L): if X[i,t,l]: emit_probs[:, l] += Q emit_sum += Q normalize_trans(theta, alpha, beta, gamma) emit_probs[:] = sp.dot(sp.diag(1./emit_sum), emit_probs) args.emit_sum = emit_sum make_log_obs_matrix(args)
def independent_update_params(args, renormalize=True): X = args.X Q, Q_pairs, theta, alpha, beta, gamma, vert_parent, vert_children, log_obs_mat, pseudocount = ( args.Q, args.Q_pairs, args.theta, args.alpha, args.beta, args.gamma, args.vert_parent, args.vert_children, args.log_obs_mat, args.pseudocount) I, T, K = Q.shape L = X.shape[2] if args.continuous_observations: new_means = np.zeros_like(args.means) new_variances = np.zeros_like(args.variances) total_q = np.zeros_like(args.variances) else: emit_probs = args.emit_probs emit_probs[:] = pseudocount theta[:] = pseudocount alpha[:] = pseudocount beta[:] = pseudocount gamma[:] = pseudocount for i in xrange(I): vp = vert_parent[i] for t in xrange(T): for k in xrange(K): if i==0 and t==0: gamma[k] += Q[i, t, k] else: for v in xrange(K): if t == 0: beta[v,k] += Q[vp,t,v] * Q[i,t,k] else: alpha[v,k] += Q_pairs[i,t,v,k] if not args.continuous_observations: for l in xrange(L): if X[i,t,l]: emit_probs[k, l] += Q[i, t, k] if args.continuous_observations: for i in xrange(I): for t in xrange(T): for k in xrange(K): for l in xrange(L): new_means[k,l] += Q[i, t, k] * X[i,t,l] # expectation of X wrt Q total_q[k,l] += Q[i,t,k] args.means[:] = new_means = new_means / total_q + 1e-50 np.seterr(under='ignore') for i in xrange(I): for t in xrange(T): for k in xrange(K): for l in xrange(L): new_variances[k,l] += Q[i, t, k] * (X[i,t,l] - new_means[k,l]) * (X[i,t,l] - new_means[k,l]) np.seterr(under='print') args.variances[:] = new_variances / total_q # 1 / N_k args.variances += pseudocount else: normalize_emit(Q, emit_probs, pseudocount, args, renormalize) if renormalize: theta += theta.max() * (pseudocount * 1e-20) alpha += alpha.max() * (pseudocount * 1e-20) beta += beta.max() * (pseudocount * 1e-20) gamma += gamma.max() * (pseudocount * 1e-20) normalize_trans(theta, alpha, beta, gamma) if args.continuous_observations: make_log_obs_matrix_gaussian(args) else: make_log_obs_matrix(args)
def independent_update_params(args, renormalize=True): X = args.X Q, Q_pairs, theta, alpha, beta, gamma, vert_parent, vert_children, log_obs_mat, pseudocount = ( args.Q, args.Q_pairs, args.theta, args.alpha, args.beta, args.gamma, args.vert_parent, args.vert_children, args.log_obs_mat, args.pseudocount) I, T, K = Q.shape L = X.shape[2] if args.continuous_observations: new_means = np.zeros_like(args.means) new_variances = np.zeros_like(args.variances) total_q = np.zeros_like(args.variances) else: emit_probs = args.emit_probs emit_probs[:] = pseudocount theta[:] = pseudocount alpha[:] = pseudocount beta[:] = pseudocount gamma[:] = pseudocount for i in xrange(I): vp = vert_parent[i] for t in xrange(T): for k in xrange(K): if i == 0 and t == 0: gamma[k] += Q[i, t, k] else: for v in xrange(K): if t == 0: beta[v, k] += Q[vp, t, v] * Q[i, t, k] else: alpha[v, k] += Q_pairs[i, t, v, k] if not args.continuous_observations: for l in xrange(L): if X[i, t, l]: emit_probs[k, l] += Q[i, t, k] if args.continuous_observations: for i in xrange(I): for t in xrange(T): for k in xrange(K): for l in xrange(L): new_means[k, l] += Q[i, t, k] * X[i, t, l] # expectation of X wrt Q total_q[k, l] += Q[i, t, k] args.means[:] = new_means = new_means / total_q + 1e-50 np.seterr(under='ignore') for i in xrange(I): for t in xrange(T): for k in xrange(K): for l in xrange(L): new_variances[k, l] += Q[i, t, k] * ( X[i, t, l] - new_means[k, l]) * (X[i, t, l] - new_means[k, l]) np.seterr(under='print') args.variances[:] = new_variances / total_q # 1 / N_k args.variances += pseudocount else: normalize_emit(Q, emit_probs, pseudocount, args, renormalize) if renormalize: theta += theta.max() * (pseudocount * 1e-20) alpha += alpha.max() * (pseudocount * 1e-20) beta += beta.max() * (pseudocount * 1e-20) gamma += gamma.max() * (pseudocount * 1e-20) normalize_trans(theta, alpha, beta, gamma) if args.continuous_observations: make_log_obs_matrix_gaussian(args) else: make_log_obs_matrix(args)
def bp_update_params_new(args, renormalize=True): lmds, pis = args.lmds, args.pis vert_parent, vert_children = args.vert_parent, args.vert_children #print pis[0].shape I, T, L = args.X.shape K = args.gamma.shape[0] theta, alpha, beta, gamma, emit_probs, X = (args.theta, args.alpha, args.beta, args.gamma, args.emit_probs, args.X) evidence = args.evidence #evid_allchild(lmds, vert_children) emit_probs_mat = sp.exp(args.log_obs_mat) #emit_probs_mat /= emit_probs_mat.max(axis=2).reshape(I, T, 1) gamma_p = copy.copy(gamma) alpha_p = copy.copy(alpha) beta_p = copy.copy(beta) theta_p = copy.copy(theta) # emit_probs_p = copy.copy(emit_probs) theta[:] = args.pseudocount alpha[:] = args.pseudocount beta[:] = args.pseudocount gamma[:] = args.pseudocount emit_probs[:] = args.pseudocount #evidence = evid_allchild(lmds, args.vert_children) ##support = casual_support(pis) emit_sum = sp.zeros((K, L)) for i in xrange(I): vp = vert_parent[i] if i != 0: idx_i = vert_children[vp].tolist().index(i) for t in xrange(T): if i == 0 and t == 0: gamma += emit_probs_mat[i, t, :] * evidence[i, t, :] Q = emit_probs_mat[i, t, :] * evidence[i, t, :] elif i == 0: tmp1, tmp2 = sp.ix_( pis[i][-1, t - 1, :], emit_probs_mat[i, t, :] * evidence[i, t, :]) tmp = alpha_p * (tmp1 * tmp2) # belief #tmp /= tmp.sum() Q = tmp.sum(axis=0) alpha += tmp / tmp.sum() elif t == 0: tmp1, tmp2 = sp.ix_(pis[vp][idx_i, t, :], emit_probs_mat[i, t, :] * evidence[i, t, :]) # i-1->0 tmp = beta_p * (tmp1 * tmp2) # belief Q = tmp.sum(axis=0) beta += tmp / tmp.sum() else: tmp1, tmp2, tmp3 = sp.ix_( pis[vp][idx_i, t, :], pis[i][-1, t - 1, :], emit_probs_mat[i, t, :] * evidence[i, t, :]) tmp = theta_p * (tmp1 * tmp2 * tmp3) Q = (tmp.sum(axis=0)).sum(axis=0) theta += tmp / tmp.sum() Q /= Q.sum() for l in xrange(L): if args.mark_avail[i, l] and X[i, t, l]: emit_probs[:, l] += Q emit_sum[:, l] += Q if renormalize: normalize_trans(theta, alpha, beta, gamma) emit_probs[:] = sp.dot(sp.diag(1. / emit_sum), emit_probs) args.emit_sum = emit_sum make_log_obs_matrix(args)