我试图使用pymc 2来模拟一个简单的概率编程示例。我一直在玩其他语言,如Church和Anglican,并且能够毫无困难地模拟这个问题。但是,我似乎无法用Python来解决这个问题。
以下是code in Anglican,我认为它非常不言自明:
[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。
我在这里遗漏了什么吗?我对这些可能性感到兴奋,但此刻我很困惑!谢谢你的帮助!
答案 0 :(得分:2)
如果我理解正确的话,这是一个很好的例子来证明英国圣公会与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的步骤除非能够解决这个问题,否则不会去任何地方。以下是an IPython Notebook,其中显示了更多细节。