PyMC 初学者:如何从拟合模型中实际采样

机器算法验证 马尔可夫链蒙特卡罗 pymc
2022-03-03 03:59:42

我正在尝试一个非常简单的模型:在我假设我知道精度的地方拟合一个 Normal,我只想找到平均值。下面的代码似乎正确地适合法线。但是在拟合之后,我想从模型中采样,即生成与我的data变量相似的新数据。我知道我可以trace("mean")用来获取平均变量的样本。但是我怎样才能从模型本身中获取新样本呢?

我查看了文档,例如http://pymc-devs.github.io/pymc/database.html#accessing-sampled-data我还看过不少例子,例如矿难,还有一些来自概率编程笔记本的例子,但都没有提到这一点。我(或多或少是 MCMC 初学者)期望从拟合模型中采样是重点!我错过了什么?

from pymc import *
data = np.array([-1, 0, 4, 0, 2, -2, 1, 0, 0, 2, 1, -3, -1, 0, 0, 1, 0, 1])
mean = Uniform("mean", -4, 4)
precision = 2.0**-2
obs = Normal("obs", mean, precision, value=data, observed=True)
model = Model( {"mean": mean, "obs": obs})
mcmc = MCMC(model)
mcmc.sample(10000, 1000, 1)
# I can get samples for the "mean" variable
mean_samples = mcmc.trace("mean")[:]
hist(mean_samples)
# but how can I do the equivalent of mcmc.trace("obs")?
2个回答

您正在寻找所谓的预测分布包括这一点非常简单。在创建 之前Model,添加额外的随机变量:

predictive = mc.Normal( "predictive", mean, precision )
model = Model( {"mean": mean, "obs": obs, "pred":predictive})

...

predictive_traces = mcmc.trace("predictive")[:]
hist( predictive_traces )

拟合模型的人工数据

这将从拟合模型中生成人工数据。感谢您提请我注意此疏忽,我会将其包含在 BMH 项目中。

几年后在使用 PyMC3 寻找相同的东西时登陆这里,所以我将留下一个与新版本相关的答案:(来自Posterior Predictive Checks)。

ppc = pm.sample_ppc(trace, samples=500, model=model, size=100)

现在,ppc 包含 500 个生成的数据集(每个包含 100 个样本),每个都使用与后验不同的参数设置。