2013-07-01 93 views
7

假設我們在X(例如X〜高斯)和前向運算符y = f(x)之前給出。假設我們進一步通過實驗觀察到,並且該實驗可以無限重複。輸出Y被假定爲高斯(Y〜高斯)或無噪聲(Y〜Delta(觀察))。用PyMC解決逆問題

如何一致地更新我們關於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

回答

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

問題是您的函數$ y = x^2 $不是一對一的。具體而言,因爲當您將X的符號平分時,您將失去有關X符號的所有信息,因此無法從Y值中判斷您最初是使用2還是-2來生成數據。如果您在第一次迭代後爲X創建曲線直方圖,您將看到:histogram of trace after first iteration

此分佈有2種模式,一種是2(您的真實值),另一種是-2。在下一次迭代中,x.mean()將接近零(對雙峯分佈進行平均),這顯然不是你想要的。

+0

我知道F(X)是不是一個雙射,它被選中,是因爲那具體原因。就我所知,MCMC能夠對複雜的多模式分佈進行採樣,但我無法看到MCMC因輸入分佈而失敗的任何爭論。 – juliohm

+0

哦,我明白你的觀點,問題在於我如何更新之前。通過簡單地使用pos.mean()和pos.var()我假設一個單峯解決方案。如何解決找到2和-2的問題? – juliohm

+1

換句話說,如何用PyMC表示非參數分佈?給定跟蹤,生成一個匹配直方圖的PDF。 – juliohm