T_check = 1 d_check = 0 h_samples_vec = np.zeros((N - N_burn - 1, d)) count = 0 for k in range(0, N): #Update pgs omega_z = update.pg_update(1, h, u, Wz, Uz, bz, T, d) omega_r = update.pg_update(1, h, u, Wr, Ur, br, T, d) rh[:-1, :, :] = r * h[:-1, :, :] gamma = update.pg_update(1, rh, u, 2 * Wp, 2 * Up, 2 * bp, T, d) #Update v fv = build.build_v_param(h, z, rh, u, Wp, Up, bp, inv_var, d) Ev = update.update_bern(fv) v = np.random.binomial(1, Ev, size=(T, d, 1)) #Update Zs fz = build.build_z_param(h, v, inv_var.reshape(d, 1), Wz, Uz, u, bz, d) Ez = update.update_bern(fz) z = np.random.binomial(1, Ez, size=(T, d, 1)) #Update r's for j in range(0, d): frd = build.build_rd_param(h, u, v, gamma, r, Wp, Up, bp, Wr, Ur, br, j) Erd = update.update_bern(frd) r[:, j, :] = np.random.binomial(1, Erd, size=(T, 1))
def gibbs_loop(N, N_burn, T, d,T_check, ud, yd, h0, inv_var, Sigma_y_inv, Sigma_theta, Sigma_y_theta,Sigma_y, Wz_mu_prior, Wr_mu_prior, Wp_mu_prior, Wy_mu_prior, Wz, Uz, bz, Wr, Ur, br, Wp, Up, bp, Wy, by, train_weights, u, y, h, r, rh, z, log_check): ### h_plot_samples = np.zeros((N,d)) log_joint_vec = [] ### h_samples_vec = np.zeros((N-N_burn-1,T,d)) h_samples_vec2 = np.zeros((N-N_burn-1,T+1,d)) z_samples_vec = np.zeros((N-N_burn-1,T,d)) r_samples_vec = np.zeros((N-N_burn-1,T,d)) v_samples_vec = np.zeros((N-N_burn-1,T,d)) Wz_bar_samples_vec = np.zeros((N-N_burn-1,d,d+ud+1)) Wr_bar_samples_vec = np.zeros((N-N_burn-1,d,d+ud+1)) Wp_bar_samples_vec = np.zeros((N-N_burn-1,d,d+ud+1)) Wy_bar_samples_vec = np.zeros((N-N_burn-1,yd,d+1)) h_samples =0 z_samples =0 r_samples =0 v_samples =0 Wz_bar_samples = 0 Wr_bar_samples = 0 Wp_bar_samples = 0 Wy_bar_samples = 0 Wz_bar = Wz_mu_prior Wr_bar = Wr_mu_prior Wp_bar = Wp_mu_prior Wy_bar = Wy_mu_prior for k in range(0,N): #Update pgs omega_z = update.pg_update(1, h, u, Wz, Uz, bz, T, d) omega_r = update.pg_update(1, h, u, Wr, Ur, br, T, d) rh[:-1,:,:] = r*h[:-1,:,:] gamma = update.pg_update(1, rh, u, 2*Wp, 2*Up, 2*bp, T, d) #Update v fv = build.build_v_param(h,z,rh,u,Wp,Up,bp, inv_var, d) Ev = update.update_bern(fv) v = np.random.binomial(1, Ev, size=(T,d,1)) #Update Zs fz = build.build_z_param(h,v,inv_var.reshape(d,1), Wz, Uz, u, bz, d) Ez = update.update_bern(fz) z = np.random.binomial(1,Ez, size=(T,d,1)) #Update r's for j in range(0,d): frd = build.build_rd_param(h,u,v,gamma,r,Wp,Up,bp,Wr,Ur,br,j) Erd = update.update_bern(frd) r[:,j,:] = np.random.binomial(1,Erd, size=(T,1)) #Update hs #Kalman sampling J_dyn_11,J_dyn_22,J_dyn_21,J_obs,J_ini = build.build_prec_x_kalman( inv_var, Sigma_y_inv, Wy, Wz, omega_z, z, Wr, omega_r, r, Wp, gamma, v, T, d) h_dyn_1, h_dyn_2, h_obs, h_ini = build.build_prec_muT_kalman( h0, u, inv_var, y, Sigma_y_inv, Wy, by, z, omega_z, Wz, Uz, bz, r, omega_r, Wr, Ur, br, v, Wp, Up, bp, gamma, T, d) log_Z_obs = np.zeros(T) h =messages.kalman_info_sample(J_ini, h_ini, 0, J_dyn_11, J_dyn_21, J_dyn_22, h_dyn_1, h_dyn_2, 0, J_obs, h_obs, log_Z_obs) h = h.reshape(T,d,1) h = np.concatenate((h0.reshape(1,d,1), h), axis=0) ''' #Full T*dXT*d matrix prec = build.build_prec_x(inv_var, Sigma_y_inv, Wy, Wz, omega_z, z, Wr, omega_r, r, Wp, gamma, v, T, d) prec_muT = build.build_prec_muT(h0, u, inv_var, y, Sigma_y_inv, Wy, by, z, omega_z, Wz, Uz, bz, r, omega_r, Wr, Ur, br, v, Wp, Up, bp, gamma, T, d) mu, covar = update.update_normal_dim(prec,prec_muT) h = np.random.multivariate_normal(mu[:,0],covar) h = h.reshape(T,d,1) h = np.concatenate((h0.reshape(1,d,1), h), axis=0) ''' ''' #Sample y's, for Testing purposes Ey = Wy @ h[1:] + by Sig_y_diag = np.diag(Sigma_y).reshape(yd,1) Sig_y_in = np.ones((T,yd,1))*Sig_y_diag y= np.random.normal(Ey, np.sqrt(Sig_y_in)) ''' if train_weights == True: #Update Weights x = np.concatenate((h[:-1,:,:],u, np.ones((T,1,1))), axis=1) xxT = (x[...,None]*x[:,None,:]).reshape(T,d+ud+1,d+ud+1) Wz_bar, Wz, Uz, bz = update.Wbar_update(z,omega_z,x,xxT, 1/Sigma_theta, Wz_mu_prior,T,d,ud) Wr_bar, Wr, Ur, br = update.Wbar_update(r,omega_r,x,xxT, 1/Sigma_theta, Wr_mu_prior,T,d,ud) #slight adjustment to x for tanh approx rx = 2*np.concatenate((h[:-1,:,:]*r,u, np.ones((T,1,1))), axis=1) rxrxT = (rx[...,None]*rx[:,None,:]).reshape(T,d+ud+1,d+ud+1) Wp_bar, Wp, Up, bp = update.Wbar_update(v, gamma, rx, rxrxT, 1/Sigma_theta, Wp_mu_prior,T,d,ud) #Update y weights x = np.concatenate((h[1:,:,:], np.ones((T,1,1))), axis=1) xxT = (x[...,None]*x[:,None,:]).reshape(T,d+1,d+1) Wy_bar, Wy, by = update.Wbar_y_update(x,xxT,y, Sigma_y_inv, 1/Sigma_y_theta, Wy_mu_prior, T,d,yd) if k > N_burn: h_samples_vec[k-N_burn-1] = h[1:].reshape(T,d) h_samples_vec2[k-N_burn-1] = h.reshape(T+1,d) z_samples_vec[k-N_burn-1] = z.reshape(T,d) r_samples_vec[k-N_burn-1] = r.reshape(T,d) v_samples_vec[k-N_burn-1] = v.reshape(T,d) h_samples += h z_samples += z r_samples += r v_samples += v Wz_bar_samples += Wz_bar Wz_bar_samples_vec[k-N_burn-1] = Wz_bar Wr_bar_samples += Wr_bar Wr_bar_samples_vec[k-N_burn-1] = Wr_bar Wp_bar_samples += Wp_bar Wp_bar_samples_vec[k-N_burn-1] = Wp_bar Wy_bar_samples += Wy_bar Wy_bar_samples_vec[k-N_burn-1] = Wy_bar print(k) ### h_plot_samples[k] = h[T_check,:,0] sig_h_inv = np.diag(inv_var) if k%log_check == 0: log_joint_vec.append( log_prob.marg_full_log_joint_no_weights(T, d, yd, u, y, h, sig_h_inv, z, v, r, Wz, Uz, bz, Wr, Ur, br, Wp, Up, bp, Wy, by, Sigma_y_inv) ) ### return h_samples, z_samples, r_samples, v_samples, Wz_bar_samples, Wr_bar_samples, Wp_bar_samples, Wy_bar_samples, h_samples_vec, Wz_bar_samples_vec, Wr_bar_samples_vec, Wp_bar_samples_vec, Wy_bar_samples_vec, h_plot_samples, log_joint_vec, z_samples_vec, r_samples_vec, v_samples_vec, h_samples_vec2
N = 10000 log_like_vec = [] h_samples = 0 z_samples = 0 N_burn = .4 * N for k in range(0, N): g = W @ h + U @ u + b bpg = 1 omega = update.sample_post_pg(bpg, g, T, d) fz = W @ h + U @ u + b Ez = update.update_bern(fz) z = np.random.binomial(1, Ez, size=(T, d, 1)) prec = build.build_prec_x(inv_var, W, omega[0, :, 0]) prec_muT = build.build_prec_muT(h0, u, inv_var, z, omega, W, U, b, T, d) mu, covar = update.update_normal_dim(prec, prec_muT) h = np.random.multivariate_normal(mu[0, :, 0], covar) h = h.reshape(T, d, 1) ''' x = np.concatenate((h,u, np.ones((1,1,1))), axis=1) xxT = (x[...,None]*x[:,None,:]).reshape(T,d+ud+1,d+ud+1) print(np.linalg.matrix_rank(xxT)) Wbar = update.Wbar_update(z,omega,x,xxT,T,d,ud) print(Wbar) '''