当前位置: 代码迷 >> python >> PyMC3确定性变量的后验预测检查
  详细解决方案

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

热度:47   发布时间:2023-06-13 13:57:06.0

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

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

使用pymc3.sampling.sample_ppcdist2和其他随机变量中获取后验预测样本dist2 pymc3.sampling.sample_ppc ,但是给定了这些样本,我模型的大部分值来自val1val2的状态。

问题出现在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已经具有图形的事实,这似乎很愚蠢。

是的,我误解了.sample_ppc的目的。 对于未观察到的变量,您不需要它,因为这些变量在跟踪中都有样本。 由于不会观察到变量,因此不会对其进行采样,因此您需要sample_ppc来生成样本。

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