我正在使用 PyMC 对后验分布进行采样,并且在使用来自样本而不是模型的先验时遇到了障碍。我的情况如下:
- 我有一些参数的经验数据我从中计算概率分布. 没有已知的模型/参数化分布. 我所拥有的只是经验值。众所周知范围在 0 到 30 之间。
- 我有一些新的观察我计算可能性, 也是凭经验的。
- 我希望找到用上面的新数据更新的后验分布。(这个后验成为下一组观察的新先验。冲洗并重复。)
例如,考虑一下:
import numpy as np
import matplotlib.pyplot as plt
# Ignore the fact that I'm using a mixture model. For all practical
# purposes, I do not know how this is generated.
old_data = np.array([3 * np.random.randn(1000) + 20,
3 * np.random.randn(1000) + 5,
4 * np.random.randn(1000) + 10])
new_data = np.array([4 * np.random.randn(50) + 8,
2 * np.random.randn(50) + 17])
plt.hist(filter(lambda x: 0 <= x <= 30, old_data.flatten()),
bins=range(0, 30), normed=True, alpha=0.5)
plt.hist(filter(lambda x: 0 <= x <= 30, new_data.flatten()),
bins=range(0, 30), normed=True, alpha=0.5)
plt.legend(['p(z)', 'p(x|z)'])
来到 PyMC,我发现的所有现有资源(例如,来自贝叶斯黑客的这一章)对观察值 ( observations = pm.Normal("obs", center_i, tau_i, value=data, observed=True)
) 使用正态分布,对精度和均值分别使用均匀和正态先验分布。
我不确定如何在 PyMC 中断言我的先验是这里的分布而不是模型。我也尝试过将@Stochastic
装饰器与 一起使用observed=True
,但我认为我并不完全理解它。此外,我似乎仍然无法找到避免指定模型的方法。
我是否从根本上误解了 MCMC 库的目的?如果是这样,我应该如何进行?
我真正想要的只是用新的观察来更新我先前的信念,但我认为解决方案并不像将两个直方图相乘(和归一化)那么简单。