问题描述
TL; DR
在pm.Deterministic
上进行后验预测检查的正确方法是什么?将随机性(呈现确定性也随机性)作为输入的确定性变量?
太短; 没听懂
假设我们有一个像这样的pymc3
模型:
import pymc3 as pm
with pm.Model() as model:
# Arbitrary, trainable distributions.
dist1 = pm.Normal("dist1", 0, 1)
dist2 = pm.Normal("dist2", dist1, 1)
# Arbitrary, deterministic theano math.
val1 = pm.Deterministic("val1", arb1(dist2))
# Arbitrary custom likelihood.
cdist = pm.DensityDistribution("cdist", logp(val1), observed=get_data())
# Arbitrary, deterministic theano math.
val2 = pm.Deterministic("val2", arb2(val1))
我可能会误会,但我的意图是要对dist1
和dist2
进行采样,并将这些采样输入确定性变量中。
只能对观察到的随机变量进行后验预测检查吗?
使用pymc3.sampling.sample_ppc
从dist2
和其他随机变量中获取后验预测样本dist2
pymc3.sampling.sample_ppc
,但是给定了这些样本,我模型的大部分值来自val1
和val2
的状态。
问题出现在pm.Deterministic(.)
似乎返回th.TensorVariable
。
因此,在调用此方法时:
ppc = pm.sample_ppc(_trace, vars=[val1, val2])["val1", "val2"]
...和pymc3
试图在这个代码块pymc3.sampling
:
410 for var in vars:
--> 411 ppc[var.name].append(var.distribution.random(point=param,
412 size=size))
...抱怨是因为th.TensorVariable
显然没有.distribution
。
那么,通过确定性方法携带随机后验样本的正确方法是什么?
我需要明确地创建一个th.function
是采取随机采样后,计算确定性值?
鉴于pymc3
已经具有图形的事实,这似乎很愚蠢。
1楼
是的,我误解了.sample_ppc
的目的。
对于未观察到的变量,您不需要它,因为这些变量在跟踪中都有样本。
由于不会观察到变量,因此不会对其进行采样,因此您需要sample_ppc
来生成样本。
简而言之,我可以从跟踪中收集pm.Deterministic
变量的样本。