从 PyMC3 中的混合物中采样点时获取分布

Get the distribution when a point is sampled from a mixture in 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 中可以不用手动操作吗?

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 上,这会使您的结果产生偏差,尤其是对于较小的数据集。

祝你好运!