Dear fellow pyromants,
i have a question regarding how to obtain the posterior predictive distribution using MCMC techniques.
Here is the little example code i am trying to run:
# generate some data
np.random.seed(1)
xs = to.tensor(np.linspace(-2,2,23)).float()
f = lambda z : z*.5 + 1
ys = f(xs) + to.tensor(np.random.normal(0, .5, size=len(xs))).float()
def y_model(x, y_obs=None):
''' very simple linreg model'''
# priors
w = pyro.sample('w', pyro.distributions.Normal(loc=0, scale=10))
b = pyro.sample('b', pyro.distributions.Normal(loc=0, scale=10))
f_x = w*x + b
y = pyro.sample('y', pyro.distributions.Normal(loc=f_x, scale=1), obs=y_obs)
return f_x
I can now sample models from the prior by just running
samples_from_prior = y_model(xs, None)
For inference, as described in the title, i want to use MCMC techniques:
from pyro.infer.mcmc import MCMC, NUTS
posterior_trace = MCMC(kernel=NUTS(y_model), num_samples=1337, warmup_steps=100)
posterior_trace.run(xs, ys)
The posterior_trace
is now an pyro.infer.mcmc.mcmc
object, on which i can call posterior_trace.marginal(sites=..).empirical[..]
to get the samples for the respective random variables “w” and “b” (and also ‘y’). And this is about how far the tutorial goes.
But now i would like to sample models y_model
given the parameter configurations in the posterior_trace
. I am not sure how this is ment to be done.
In case of SVI and a given guide i usually did the following:
model_predictions = []
for _ in range(100): # sample 100 models (i.e. posteriors given y_obs)
## trace of the guide (samples all variables given x from the guide)
guide_trace = pyro.poutine.trace(guide).get_trace(xs, None)
# runs the model using samples from the guide for the latent variables
replay_result = pyro.poutine.replay(y_model, guide_trace)(xs, None)
# append to list
model_predictions.append(replay_result.detach().numpy())
which would give me 100 sampled models from the (guide-approximated) posterior predictive distribution.
How can i achieve the same using the results obtained from MCMC ?
Thanks in advance !
PS:
- What tutorial are you running? (a very slim version of)
Bayesian Regression - Inference Algorithms (Part 2) — Pyro Tutorials 1.8.4 documentation - What version of Pyro are you using?
‘0.3.1’