从PyMC3

时间:2017-05-24 18:33:32

标签: python pymc3

我有一个pm.NormalMixture()的模型,当我从普通混合物中采样时,我也想知道哪些混合分布是从中采样的。

import numpy as np
import pymc3 as pm

obs = np.concatenate([np.random.normal(5,1,100), 
                      np.random.normal(10,2,200)])
with pm.Model() as model:
    mu = pm.Normal('mu', 10, 10, shape=2)
    sd = pm.Normal('sd', 10, 10, shape=2)
    x = pm.NormalMixture('x', mu=mu, sd=sd, observed=obs)

我从该模型中采样,然后使用该跟踪从后验预测分布中采样,我想知道的是后验预测轨迹中的每个x,两个正态分布中的哪一个是从它属于。如果不手动完成,可以在PyMC3中实现吗?

1 个答案:

答案 0 :(得分:1)

This example演示了后验预测检查(PPC)的工作原理。 PPC的要点是您首先从迹线中绘制随机样本。跟踪基本上总是多变量的,在模型中,单个样本将由向量(mu[i,0], mu[i,1], sd[i,0], sd[i,1])定义。然后,对于每个跟踪样本,从为可能性指定的分布中生成随机数,其参数值等于跟踪样本的参数值。在您的情况下,这将是NormalMixture(mu[i,:], sd[i,:])。在您的模型中,x是似然函数,而不是跟踪的单个点。

一些实用说明:

  • 你还没有指定一个加权变量,所以我默认假设它会强制正态分布加权(我没有对此进行测试)。
  • 来自一个分布或另一个分布的给定点的几率只是该点概率密度之间的比率。
  • 查看this,了解有关如何选择先验的建议。例如,您的SD优先级会对非常大的SD施加很大的影响,这会使您的结果产生偏差,尤其是对于较小的数据集。
祝你好运!