# # To do: # # * Put priors/weight decay on coefficients # * Fix first dimension of tensors: # * predicting with different N # * minibatching # * Extend the response distribution # * overdispersion # * zero-inflation # * Repeated measures for sites & observers # * Penalties to discourage structure in `qz`? # * Imputation/missing values? # * Maybe only after model has already been trained, like Mistnet's figure 5 # In[ ]: q = qz.variance().eval() plt.scatter(x_train[:,0], q[:,0], alpha=0.25) plt.scatter(x_train[:,0], q[:,1], alpha=0.25) # In[ ]: # In[ ]:
X_q_tf = tf.constant(X_q, dtype=tfdt) X_q_features = rbf_kernel( X_q_tf, qhinge_grid.mean(), qgamma.bijector.forward(qgamma.distribution.mean()), tfdt) # Running inference for t in range(inference.n_iter): if t % 10 == 0: print("\nsaving {}".format(t)) qgamma_eval = qgamma.bijector.forward( qgamma.distribution.mean()).eval() qgamma_var_eval = qgamma.distribution.variance().eval() qhinge_grid_eval = qhinge_grid.mean().eval() post_mu = tf.matmul(X_q_features, qw.mean()) post_var = tf.reduce_sum(tf.square(X_q_features) * tf.transpose(qw.variance()), axis=1, keepdims=True) kappa_var = 1 / tf.sqrt(1 + np.pi * post_var / 8) probs = tf.sigmoid(kappa_var * post_mu) probs_eval = probs.eval() FIG = plt.figure(figsize=(14, 9)) ax = plt.subplot(131) scattr = ax.scatter(X[:, 0], X[:, 1], c=Y.flatten(), s=2, cmap='jet') ax.set_xlim(*display_xlim)
# Model: deep/shallow GP (generative model) X = Normal(loc=tf.zeros([N, K]), scale=tf.ones([N, K])) Kernal = rbf(X) + tf.eye(N) * 1e-6 cholesky = tf.tile(tf.reshape(tf.cholesky(Kernal), [1, N, N]), [H1, 1, 1]) h1 = MultivariateNormalTriL(loc=tf.zeros([H1, N]), scale_tril=cholesky) Kernal1 = rbf(tf.transpose(h1)) + tf.eye(N) * 1e-6 cholesky1 = tf.tile(tf.reshape(tf.cholesky(Kernal1), [1, N, N]), [H2, 1, 1]) h2 = MultivariateNormalTriL(loc=tf.zeros([H2, N]), scale_tril=cholesky1) Kernal2 = rbf(tf.transpose(h2)) + tf.eye(N) * 1e-6 cholesky2 = tf.tile(tf.reshape(tf.cholesky(Kernal2), [1, N, N]), [D, 1, 1]) Y = MultivariateNormalTriL(loc=tf.zeros([D, N]), scale_tril=cholesky2) # Inference (recongnition model) qX = Normal(loc=tf.Variable(tf.random_normal([N, K])), scale=tf.nn.softplus(tf.Variable(tf.random_normal([N, K])))) inference = ed.KLqp({X: qX}, data={Y: data.transpose()}) inference.run(n_iter=1000) # Evaluate sess = ed.get_session() qX_mean, qX_var = sess.run([qX.mean(), qX.variance()]) plt.scatter(qX_mean[:, 0], qX_mean[:, 1]) Y_post = ed.copy(Y, {X: qX}) Y_post = Y_post.eval() plt.scatter(Y_post[:, 0], Y_post[:, 1]) plt.scatter(data[:, 0], data[:, 1]) # observation