Hello,
I have implemented a zero-inflated Poisson model. However, I am getting trivial posterior estimates for both the mean and the Bernoulli probability. I am not sure what is wrong with the model specification. My goal is to build a ZIP Factor Model using the Metropolis-Hasting sampler. I am using edward==1.3.1 and tensorflow==1.1.0. I have taken snippets from my jupyter notebook and posted them below:
from __future__ import absolute_import
from __future__ import division
from __future__ import print_function
import edward as ed
import numpy as np
import tensorflow as tf
# Generate Data
np.random.seed(56789)
N = 1000
a = 0.5
b = 2
p_0 = 0.2
lam_true = np.random.gamma(shape=a, scale=b)
z_true = np.random.binomial(n=1, p=p_0, size=N)
from edward.models import Gamma, Poisson, Bernoulli, Beta, Empirical
print('lambda={}'.format(lam_true))
print('p={}'.format(p_0))
# Prior definition
alpha = tf.Variable(1.8, trainable=False)
beta = tf.Variable(1.0, trainable=False)
a = tf.Variable(1.0, trainable=False)
b = tf.Variable(4.0, trainable=False)
# Posterior inference
# Probabilistic model
lam = Gamma(alpha, beta)
p = Beta(a, b)
z = Bernoulli(tf.ones(N) * p)
y = Poisson(rate=tf.scalar_mul(lam, tf.to_float(1 - z, name='ToFloat')))
# Inference
T = 10000 # Number of samples.
qlam = Empirical(params=tf.Variable(tf.zeros(T) + 0.5))
qp = Empirical(params=tf.Variable(tf.zeros(T) + 0.5))
qz = Empirical(params=tf.Variable(tf.zeros([T, N], dtype=tf.int32)))
glam = Gamma(1.8, 1.0)
gp = Beta(1.0, 4.0)
gz = Bernoulli(tf.zeros(N))
inference = ed.MetropolisHastings(latent_vars={lam: qlam, p: qp, z: qz},
proposal_vars={lam: glam, p: gp, z: gz},
data={y: y_obs})
inference.initialize()
sess = ed.get_session()
tf.global_variables_initializer().run()
for _ in range(inference.n_iter):
info_dict = inference.update()
inference.print_progress(info_dict)
t = info_dict['t']
if t == 1 or t % inference.n_print == 0:
qlam_mean, qp_mean = sess.run([qlam.mean(), qp.mean()])
print("")
print("Inferred lambda:")
print(qlam_mean)
print("Inferred probability:")
print(qp_mean)
y_obs = np.random.poisson(lam=lam_true*(1 - z_true))
Best,
Mark