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 param
s.