Пример #1
0
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)
Пример #2
0
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)
Пример #3
0
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)
Пример #4
0
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)