2015-08-31 97 views
1

我正試圖在PyMC3中獲得一個簡單的PyMC2模型。我已經使模型運行,但模型給出了變量的非常不同的MAP估計。這裏是我的PyMC2型號:PyMC2和PyMC3給出不同的結果...?

import pymc 
theta = pymc.Normal('theta', 0, .88) 

X1 = pymc.Bernoulli('X2', p=pymc.Lambda('a', lambda theta=theta:1./(1+np.exp(-(theta-(-0.75))))), value=[1],observed=True) 
X2 = pymc.Bernoulli('X3', p=pymc.Lambda('b', lambda theta=theta:1./(1+np.exp(-(theta-0)))), value=[1],observed=True) 

model = pymc.Model([theta, X1, X2]) 
mcmc = pymc.MCMC(model) 
mcmc.sample(iter=25000, burn=5000) 
trace = (mcmc.trace('theta')[:]) 
print "\nThe MAP value for theta is", trace.sum()/len(trace) 

這似乎符合預期。我在計算PyMC3中如何使用相當於pymc.Lambda對象時遇到了各種麻煩。我最終碰到了確定性對象。以下是我的代碼:

import pymc3 

with pymc3.Model() as model: 

    theta = pymc3.Normal('theta', 0, 0.88) 
    X1 = pymc3.Bernoulli('X1', p=pymc3.Deterministic('b', 1./(1+np.exp(-(theta-(-0.75))))), observed=[1]) 
    X2 = pymc3.Bernoulli('X2', p=pymc3.Deterministic('c', 1./(1+np.exp(-(theta-(0))))), observed=[1]) 

    start=pymc3.find_MAP() 
    step=pymc3.NUTS(state=start) 
    trace = pymc3.sample(20000, step, njobs=1, progressbar=True) 

pymc3.traceplot(trace) 

我遇到的問題是,我的圖估計使用PyMC2 theta是〜0.68(正確的),而估計PyMC3給出的〜0.26(不正確)。我懷疑這與我定義確定性函數的方式有關。 PyMC3不會讓我使用lambda函數,所以我只需要在線編寫表達式。當我嘗試使用lambda theta = theta:...我得到這個錯誤:

AsTensorError: ('Cannot convert <function <lambda> at 0x157323e60> to TensorType', <type 'function'>) 

與Theano有關?任何建議將不勝感激!

回答

0

爲了防止別人有同樣的問題,我想我找到了答案。嘗試不同的採樣算法後,我發現:

  • find_MAP給了不正確的答案
  • 螺母採樣給了不正確的答案
  • 都市採樣給了正確的答案,耶!

我在其他地方讀過NUTS採樣器不能使用確定性。我不知道爲什麼。也許find_MAP也是如此?但現在我會堅持大都會。

2

當您在Deterministic中使用theano tensor而不是numpy函數時,它可以工作。

import pymc3 
import theano.tensor as tt 

with pymc3.Model() as model: 

    theta = pymc3.Normal('theta', 0, 0.88) 
    X1 = pymc3.Bernoulli('X1', p=pymc3.Deterministic('b', 1./(1+tt.exp(-(theta-(-0.75))))), observed=[1]) 
    X2 = pymc3.Bernoulli('X2', p=pymc3.Deterministic('c', 1./(1+tt.exp(-(theta-(0))))), observed=[1]) 

    start=pymc3.find_MAP() 
    step=pymc3.NUTS(state=start) 
    trace = pymc3.sample(20000, step, njobs=1, progressbar=True) 

print "\nThe MAP value for theta is", np.median(trace['theta']) 

pymc3.traceplot(trace); 

下面是輸出:

enter image description here

+0

當使用相同的代碼時,我得到了一個相似的跟蹤中值,但是在find_MAP()中沒有得到相同的值。我的find_MAP()返回〜0.27。 – tom

0

而且,堅果不處理離散變量。如果你想使用堅果,你必須分裂採樣器:

step1 = pymc3.NUTS([theta]) 
step2 = pymc3.BinaryMetropolis([X1,X2]) 

trace = pymc3.sample(10000, [step1, step2], start) 

編輯: 錯過了「B」和「C」被定義聯機。將它們從NUTS函數中刪除

+0

此代碼引發以下錯誤:NameError:name'b'is not defined' when定義'step1' –

0

MAP值不是定義爲分佈的均值,而是定義爲其最大值。隨着pymc2你可以找到它:

M = pymc.MAP(model) 
M.fit() 
theta.value 

返回array(0.6253614422469552)

這符合您在pymc3find_MAP查找地圖,你叫start

{'theta': array(0.6253614811102668)} 

的問題這是一個更好的採樣器是不同的,並且不依賴於MAP的計算。MAP計算是一種優化。 參見:https://pymc-devs.github.io/pymc/modelfitting.html#maximum-a-posteriori-estimates對於pymc2

相關問題