Assume that I have a model
def model(weight, height):
alpha = pyro.sample("alpha", dist.normal, ng_ones(1)*178, ng_ones(1)*100)
beta = pyro.sample("beta", dist.normal, ng_zeros(1), ng_ones(1)*10)
mu = alpha + beta * weight
sigma = pyro.sample("sigma", dist.uniform, ng_zeros(1), ng_ones(1)*50)
return pyro.sample("height", dist.normal, mu, sigma.expand_as(mu), obs=height)
and its corresponding guide. After using SVI inference, I get good parameters for guide. Using guide, I get samples for alpha, beta, sigma from their posterior distribution. Now, I want to use guide and model to get samples for height.
The only way I can figure out is to use pyro.condition instead of pyro.sample(..., obs=...). We rewrite model as def model1(weight): ... then define conditioned_model = pyro.condition(...) and its corresponding guide. We use SVI to train guide. After that, we use Importance on model1 and guide, then do Marginal to get samples for height.
I would like to ask if it is the only way to do? (is there any Poutine which helps to disable the observed sites, so we can use Importance on model and guide, then Marginal to get samples for height?)
Another question is how to get samples for mu? In PyMC3, we have pymc3.Deterministic which helps to do that.
My last question is: if I want to get 100 samples for height, then how many execution traces is good enough?
Thanks a lot in advance!
Edit: There is still a problem with the way I proposed above. The requirement for guide is to include all pyro.sample from model. So the guide for model1 has to include pyro.sample('height',...). It seems that we have to define a new guide with the same params.