我正試圖在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有關?任何建議將不勝感激!
當使用相同的代碼時,我得到了一個相似的跟蹤中值,但是在find_MAP()中沒有得到相同的值。我的find_MAP()返回〜0.27。 – tom