如何用pymc 2模拟两个Poisson分布的和?

时间:2015-02-10 05:45:16

标签: python probability pymc

我试图使用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。

我在这里遗漏了什么吗?我对这些可能性感到兴奋,但此刻我很困惑!谢谢你的帮助!

1 个答案:

答案 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)

以下是我的代码中的主要差异:

  • ab是随机指标。当您使用版本
  • 中的(stochastic - 100)内容时,PyMC会为自己的优点做一些非常聪明的事情
  • precision是一个数字,不是随机数,而是一个大数,不是一个小数。这是因为PyMC在正态分布中使用精度来表示1 /方差,但在英国圣公会中(我认为)精度意味着你需要等于运算符的精确程度。
  • mcmc使用自适应Metropolis步骤方法,具有更长的老化时间。这一点非常重要,因为ab的联合后验分布具有极端的相关性,而MCMC的步骤除非能够解决这个问题,否则不会去任何地方。

以下是an IPython Notebook,其中显示了更多细节。