解决PyMC的逆问题

时间:2013-07-01 16:29:46

标签: python probability pymc mcmc

假设我们在 X (例如X~高斯)和前向算子 y = f(x)上给出了先验。假设我们通过实验进一步观察到 y ,并且该实验可以无限期地重复。输出 Y 被假定为高斯(Y~高斯)或无噪声(Y~Delta(观察))。

如何根据观察结果持续更新我们对 X 的主观认知程度?我用PyMC试过以下模型,但似乎我错过了一些东西:

from pymc import *

xtrue = 2                        # this value is unknown in the real application
x = rnormal(0, 0.01, size=10000) # initial guess

for i in range(5):
    X = Normal('X', x.mean(), 1./x.var())
    Y = X*X                        # f(x) = x*x
    OBS = Normal('OBS', Y, 0.1, value=xtrue*xtrue+rnormal(0,1), observed=True)
    model = Model([X,Y,OBS])
    mcmc = MCMC(model)
    mcmc.sample(10000)

    x = mcmc.trace('X')[:]       # posterior samples

后部不会收敛到 xtrue

2 个答案:

答案 0 :(得分:7)

@ user1572508所使用的功能现在是名为stochastic_from_data()Histogram()的PyMC的一部分。然后,该线程的解决方案变为:

from pymc import *
import matplotlib.pyplot as plt

xtrue = 2 # unknown in the real application
prior = rnormal(0,1,10000) # initial guess is inaccurate
for i in range(5):
  x = stochastic_from_data('x', prior)
  y = x*x
  obs = Normal('obs', y, 0.1, xtrue*xtrue + rnormal(0,1), observed=True)

  model = Model([x,y,obs])
  mcmc = MCMC(model)
  mcmc.sample(10000)

  Matplot.plot(mcmc.trace('x'))
  plt.show()

  prior = mcmc.trace('x')[:]

答案 1 :(得分:5)

问题是你的函数$ y = x ^ 2 $不是一对一的。具体来说,因为当你对它进行平方时丢失了有关X符号的所有信息,所以无法从Y值中判断出最初是使用2还是-2来生成数据。如果在第一次迭代后为X创建跟踪的直方图,您将看到:histogram of trace after first iteration

此分布有2种模式,一种为2(您的真实值),另一种为-2。在下一次迭代中,x.mean()将接近零(在双峰分布上取平均值),这显然不是你想要的。