如何使用 pymc 2 对两个泊松分布的总和进行建模?
How to model sum of two Poisson distributions with pymc 2?
我正在尝试使用 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。
我是不是漏掉了什么?我对这些可能性感到很兴奋,但现在我很困惑!感谢您的帮助!
如果我理解正确的话,这是一个很好的例子来说明 Anglican 和 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/方差,但在 Anglican 中(我认为)精度表示您需要等式运算符的精度有多接近。
mcmc
采用自适应Metropolis步法,老化时间较长。这很重要,因为 a
和 b
的联合后验分布具有极大的相关性,除非弄清楚这一点,否则 MCMC 步骤不会走到任何地方。
这里 an IPython Notebook 显示了更多细节。
我正在尝试使用 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。
我是不是漏掉了什么?我对这些可能性感到很兴奋,但现在我很困惑!感谢您的帮助!
如果我理解正确的话,这是一个很好的例子来说明 Anglican 和 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
是随机指标。当你在你的版本 中使用 precision
是一个数字,不是随机数,是一个大数字,不是一个小数字。这是因为 PyMC 使用精度表示正态分布中的 1/方差,但在 Anglican 中(我认为)精度表示您需要等式运算符的精度有多接近。mcmc
采用自适应Metropolis步法,老化时间较长。这很重要,因为a
和b
的联合后验分布具有极大的相关性,除非弄清楚这一点,否则 MCMC 步骤不会走到任何地方。
(stochastic - 100)
东西时,PyMC 做了一些太聪明的事情而不利于它自己
这里 an IPython Notebook 显示了更多细节。