PyMC3 确定性变量的后验预测检查

Posterior Predictive Check on PyMC3 Deterministic Variable

TL;博士

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))

我可能误会了,但我的意图是对 dist1dist2 的后验概率进行采样,并将这些样本输入确定性变量。是否只能对观察到的随机变量进行后验预测检查?

使用 pymc3.sampling.sample_ppcdist2 和其他随机变量中获取后验预测样本很简单,但我模型的大部分值都来自 val1 和 [= 的状态20=],给定这些样本。

问题出现在 pm.Deterministic(.) 似乎 return 和 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 已经有了图表,这似乎很愚蠢。

是的,我误解了 .sample_ppc 的目的。对于未观察到的变量,您不需要它,因为它们在跟踪中有样本。观察到的变量不是从中采样的,因为它们的数据是观察到的,因此您需要 sample_ppc 来生成样本。

简而言之,我可以从跟踪中收集 pm.Deterministic 个变量的样本。