【问题标题】:Solving inverse problems with PyMC用 PyMC 解决逆问题
【发布时间】:2013-06-28 20:39:20
【问题描述】:

假设我们有一个关于 X 的先验(例如 X ~ Gaussian)和一个前向运算符 y = f(x)。进一步假设我们通过一个实验观察到y,并且这个实验可以无限重复。假设输出 Y 为高斯 (Y ~ Gaussian) 或无噪声 (Y ~ Delta(observation))。

如何根据观察结果持续更新我们对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

【问题讨论】:

    标签: python probability pymc mcmc


    【解决方案1】:

    @user1572508 的功能现在是 PyMC 的一部分,名称为 stochastic_from_data()Histogram()。那么这个线程的解决方案就变成了:

    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')[:]
    

    【讨论】:

      【解决方案2】:

      问题在于您的函数 $y = x^2$ 不是一对一的。具体来说,因为您在平方 X 的符号时丢失了所有有关 X 符号的信息,所以无法从您的 Y 值判断您最初使用 2 还是 -2 来生成数据。如果您在第一次迭代后为 X 创建了轨迹的直方图,您将看到:

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

      【讨论】:

      • 我知道 f(x) 不是双射,之所以选择它是因为那个特定的原因。据我所知,MCMC 能够对复杂的多模态分布进行采样。
      • 哦,我明白你的意思了,问题在于我如何更新先前的。通过简单地使用 pos.mean() 和 pos.var() 我假设一个单峰解决方案。你将如何解决这个问题以找到 2 和 -2?
      • 也就是说,如何用 PyMC 表示非参数分布?给定轨迹,生成与直方图匹配的 PDF。
      • 我以前也遇到过同样的问题。我使用内核密度估计器创建了一个可以更新的非参数先验。这有点慢,但对于简单的问题似乎足够好。这是使用您的示例的要点:gist.github.com/jcrudy/5911624
      • 核密度估计适用于多峰分布。查看它的维基百科页面,尤其是这个例子:en.wikipedia.org/wiki/…。简而言之,虽然核是高斯的,但作为位置偏移高斯核的加权和的结果分布估计不一定是高斯的。如果我理解正确,您链接到的方法假定为高斯分布。您必须针对双峰分布对其进行修改,并且需要为该双峰分布指定参数形式。
      猜你喜欢
      • 2013-11-26
      • 1970-01-01
      • 2015-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多