I would like to code up a GPLVM with Poisson emissions and perform MCMC inference (VI is also fine, if that is easier). The model is
x_n ~ N(0, I)
f_j ~ GP(0, K)
Y_{nj} ~ Poisson(exp(f_j(x_n)))
In other words, Y
is an N x J
count matrix, and its J
columns are Gaussian process-distributed maps from a latent variable X
, an N x D
matrix.
Following the docstring example here, I have tried to code this up:
import pyro
import pyro.contrib.gp as gp
from pyro.distributions import Normal, Poisson
from pyro.infer.mcmc import MCMC, NUTS
import torch
N = 500 # Samples.
J = 50 # Features.
D = 2 # Latent dimension.
Y = torch.distributions.Poisson(100).sample((N, J))
kernel = gp.kernels.RBF(input_dim=D)
mu_x = torch.zeros(D)
cov_x = torch.eye(D)
mu_f = torch.zeros(N)
def model(data):
X = pyro.sample('X', Normal(mu_x, cov_x))
K_x = kernel(X)
F = pyro.sample('F', Normal(mu_f, K_x))
theta = torch.exp(F)
return pyro.sample('Y', Poisson(theta), obs=data)
nuts_kernel = NUTS(model)
mcmc = MCMC(nuts_kernel, num_samples=500, warmup_steps=100)
mcmc.run(data=Y)
mcmc.get_samples()['X'].mean(0)
However, I get the error:
RuntimeError: The size of tensor a (500) must match the size of tensor b (2) at non-singleton dimension 1
Trace Shapes:
Param Sites:
lengthscale
variance
Sample Sites:
X dist 2 2 |
value 2 2 |
It seems clear that Y
and X
do not have the same first dimension, but I don’t know how to sample N
random variables x_n
using Pyro.
Thanks for any help.