我有一个带有 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 回答
This example演示了后验预测检查(PPC)的工作原理 . PPC的要点是您首先从迹线中绘制随机样本 . 跟踪基本上总是多变量的,在您的模型中,单个样本将由向量
(mu[i,0], mu[i,1], sd[i,0], sd[i,1])
定义 . 然后,对于每个跟踪样本,从为可能性指定的分布中生成随机数,其参数值等于跟踪样本的参数值 . 在你的情况下,这将是NormalMixture(mu[i,:], sd[i,:])
. 在您的模型中,x
是似然函数,而不是跟踪的单个点 .一些实用说明:
你没有't specified a weighting variable, so I' m默认情况下它会强制正态分布加权(我没有测试过) .
来自一个分布或另一个分布的给定点的几率只是该点的概率密度之间的比率 .
查看this以获取有关如何选择先验的建议 . 例如,您的SD优先级会对非常大的SD施加很大的影响,这会使您的结果产生偏差,尤其是对于较小的数据集 .
祝好运!