def new_feature(Y, Z, W, tree, ext, K, res, sig, sig_w): ctree, ptree = tree Z, W, tree = drop_feature(Z, W, tree) F, D = get_FD(tree) if F > 8: return (Z, W, tree) else: if F + ext < K: more = K - F else: more = ext tree = add(tree, more, res) Z = draw_feature(Z, tree, res, more) W = np.vstack((W, np.random.normal(0, sig_w, (more, T)))) #W = sample_W(Y,Z,sig,sig_w) return (Z, W, tree)
def new_feature(Y, Z, W, tree, ext, K, res, sig, sig_w, drop): ctree, ptree = tree #debugging invariant vec = get_vec(tree) Z, W, tree = drop_feature(Z, W, tree) F, D = get_FD(tree) if F >= 12 or drop: return (Z, W, tree) else: if F + ext < K: more = K - F else: more = ext tree = add(tree, more, res) Z = draw_feature(Z, tree, res, more) W = np.vstack((W, np.random.normal(0, sig_w, (more, T)))) #W = sample_W(Y,Z,sig,sig_w) return (Z, W, tree)
def add_feature(i,Y,Z,W,tree,vec,prior,sig,sig_w): N,T = Y.shape N,K = Z.shape old = log_data_zw(Y,Z,W,sig) col = np.zeros((N,1)) col[i,0] = 1 Z_new = np.hstack((Z,col)) W_new = np.vstack((W,np.random.normal(0,sig_w,(1,T)))) #W_new = sample_W(Y,Z_new,sig,sig_w) new = log_data_zw(Y,Z_new,W_new,sig) new = new - old old = 0 roulette = [np.exp(old)*prior[0],np.exp(new)*prior[1]] normal_roulette = [float(r)/np.sum(roulette) for r in roulette] chosen = int(np.where(np.random.multinomial(1,normal_roulette) == 1)[0]) if chosen: Z = Z_new W = W_new tree = add(tree,res) vec = get_vec(tree) return (Z,W,tree,vec)