我正在尝试使用pymc 2建模一个简单的概率编程示例。我一直在与其他语言(例如Church和Anglican)一起玩,并且能够轻松地对此问题进行建模。但是,我似乎无法在Python中弄清楚。
[assume a (- (poisson 100) 100)]
[assume b (- (poisson 100) 100)]
[observe (normal (+ a b) .00001) 7]
[predict (list a b)]
使用Metropolis-Hastings采样器,我得到:
1 (10 1)
2 (10 8)
9977 (7 0)
20 (7 1)
使用Particle Gibbs,我得到:
669 (-1 8)
71 (-10 17)
66 (-11 18)
208 (-12 19)
19 (-13 20)
84 (-14 21)
72 (-15 22)
441 (-2 9)
...and so on...
我试图像这样在pymc中建模:
def make_model():
a = (pymc.Poisson("a", 100) - 100)
b = (pymc.Poisson("b", 100) - 100)
precision = pymc.Uniform('precision', lower=.0001, upper=1.0)
@pymc.deterministic
def mu(a=a, b=b):
return a+b
y = pymc.Normal("y", mu=mu, tau=precision, observed=True, value=7)
return pymc.Model(locals())
def run_mcmc(model):
mcmc = pymc.MCMC(model)
mcmc.sample(5000, burn=1000, thin=2)
return mcmc
result = run_mcmc(make_model())
pymc.Matplot.plot(result)
我正在跟踪a和b在100左右的位置。但是,如果运行(pymc.Poisson("a", 100) - 100).value
,我会得到接近0的数字。
我在这里想念什么吗?我对这种可能性感到兴奋,但此刻我很困惑!谢谢你的帮助!
如果我正确理解这一点,那么这是一个很好的例子,可以证明英国国教和PyMC之间在思想上的某些差异。
这是您调整后的PyMC代码的版本,我认为它可以捕获您的意图:
def make_model():
a = pymc.Poisson("a", 100) # better to have the stochastics themselves available
b = pymc.Poisson("b", 100)
precision = 1e-4**-2 # Seems like precision is fixed in Anglican model (and different from the meaning of precision in PyMC)
@pymc.deterministic
def mu(a=a, b=b):
return (a-100) + (b-100)
y = pymc.Normal("y", mu=mu, tau=precision, observed=True, value=7)
return pymc.Model(locals())
def run_mcmc(model):
mcmc = pymc.MCMC(model)
mcmc.use_step_method(pymc.AdaptiveMetropolis, [mcmc.a, mcmc.b])
mcmc.sample(20000, burn=10000, thin=10)
return mcmc
result = run_mcmc(make_model())
pymc.Matplot.plot(result)
这是我的代码中的主要区别:
a
并且b
是随机的。当您使用(stochastic - 100)
版本中的东西时,PyMC会为自己的利益做一些太聪明的事情precision
是一个数字,不是随机的,是一个大数字,不是一个小数字。这是因为PyMC在正态分布中使用精度表示1 /方差,但是在英国国教(我认为)中,精度意味着您需要等式运算符接近精度的程度。mcmc
使用自适应的Metropolis步进法,具有更长的老化时间。这很重要,因为的关节后部分布a
且b
具有极高的相关性,并且MCMC步骤除非弄清楚了,否则不会走到任何地方。这是一个IPython Notebook,其中显示了更多细节。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句