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


12

我正在尝试一个非常简单的模型:在假设我知道精度的情况下拟合法线,我只想找到均值。下面的代码似乎正确适合普通。但是在拟合之后,我想从模型中采样,即生成类似于我的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")?

正是我的问题!想知道是否在pymc3中简化了预测抽样...
Vladislavs Dovgalecs

Answers:


15

您正在寻找所谓的预测分布。包括这很简单。在创建之前Model,添加其他随机变量:

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

...

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

拟合模型的人工数据

这将从拟合的模型生成人工数据。感谢您引起我的注意,我将其包含在BMH项目中。


如何创建由n个随机变量组成的n个随机变量的数组?stackoverflow.com/questions/45283843/…(对不起,这太多了……)
德雷克

4

几年后,当使用PyMC3寻找相同的东西时,就降落了这里,因此我将留下与新版本相关的答案:(来自Posterior Predictive Checks)。

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.