我是贝叶斯统计数据和MCMC的绝对新手,所以我正在努力完成“贝叶斯数据分析:带R和BUGS的教程”#34;作者:John Kruschke。为了测试我的理解,我试图将他的例子从BUGS翻译成PyMC。
在Ch。 8,他从两个(可能有偏见的)硬币中的每一个观察到一系列翻转,并试图估计它们的偏差。低于每个硬币的偏差为theta
,观察到的翻转为y
:
import numpy as np
import pymc
priorA = 3
priorB = 3
theta1 = pymc.Beta('theta1', alpha=priorA, beta=priorB)
theta2 = pymc.Beta('theta2', alpha=priorA, beta=priorB)
y1 = pymc.Bernoulli('y1', p=theta1, value=np.array([1,1,1,1,1,0,0]), observed=True)
y2 = pymc.Bernoulli('y2', p=theta2, value=np.array([1,1,0,0,0,0,0]), observed=True)
当然,这两个硬币是独立的。如果我单独模拟它们,那么看看它们之间的差异,我会得到与本书相同的答案。 (它也同意分析解决方案和网格上的集成。)
m1 = pymc.MCMC([y1, theta1])
m1.sample(iter=10000, burn=1000, thin=2)
m2 = pymc.MCMC([y2, theta2])
m2.sample(iter=10000, burn=1000, thin=2)
dt = m1.trace('theta1')[:] - m2.trace('theta2')[:]
print np.average(dt), pymc.utils.hpd(dt, alpha=0.05)
# 0.23098692189 [-0.15303663 0.55686801]
另一方面,如果我尝试同时模拟这两个硬币,作为同一模型的一部分,我会得到一个相当不同的答案,与任何其他方法都不一致。
model = pymc.MCMC([y1, theta1, y2, theta2])
model.sample(iter=10000, burn=1000, thin=2)
dt = model.trace('theta1')[:] - model.trace('theta2')[:]
print np.average(dt), pymc.utils.hpd(dt, alpha=0.05)
# 0.330061191424 [-0.09999254 0.7190196 ]
所以我的第一个问题是,为什么?从我对这个理论的了解很少,我的猜测是,MCMC很难充分探索双参数模型。 (但是,BUGS似乎处理得很好。)
真正奇怪的是我在iPython笔记本中一直在做这一切,并且PyMC中似乎存在一个错误。如果我运行独立硬币模型,重启我的内核(内核|重启或文件|关闭和停止),然后运行联合硬币模型,联合硬币将产生类似(但不相同)的独立硬币答案(平均dtheta~0.23)。如果我以相反的顺序运行模型(在两者之间重新启动内核),它们都会从联合硬币模型产生(不正确的)答案,平均dtheta~0.33。如果我完全关闭我的iPython笔记本服务器,我只能得到两个模型来产生不同的答案。由于这也会从内存中卸载所有共享库,我希望这意味着PyMC的Fortran / C部分正在从Python解释器实例共享的内存位置缓存这些模型中的某些内容。版本为Numpy 1.8.2,PyMC 2.3.3,Python 2.7.8,iPython 2.1.0,Anaconda 2.0.0。
我非常感谢您在理解这里发生的事情时提供的任何帮助。我意识到这些都是愚蠢而琐碎的模型,但PyMC的奇怪行为目前并没有激发人们的信心!