首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PyMC2和PyMC3给出了不同的结果...?

PyMC2和PyMC3给出了不同的结果...?
EN

Stack Overflow用户
提问于 2015-08-31 12:48:59
回答 4查看 2.9K关注 0票数 1

我正在尝试让一个简单的PyMC2模型在PyMC3中工作。我已经让模型运行了,但是模型对变量给出了非常不同的MAP估计。这是我的PyMC2模型:

代码语言:javascript
复制
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对象等效的对象时,我遇到了各种各样的麻烦。我最终遇到了确定性对象。以下是我的代码:

代码语言:javascript
复制
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对θ的MAP估计为~0.68 (正确),而PyMC3给出的估计为~0.26 (不正确)。我怀疑这与我定义确定性函数的方式有关。PyMC3不允许我使用lambda函数,所以我只需要编写内联表达式。当我尝试使用lambda theta=theta:...我得到了这个错误:

代码语言:javascript
复制
AsTensorError: ('Cannot convert <function <lambda> at 0x157323e60> to TensorType', <type 'function'>)

和西亚诺有关??如有任何建议,我们将不胜感激!

EN

回答 4

Stack Overflow用户

发布于 2015-08-31 20:39:18

当您使用theano tensor而不是您的确定性中的numpy函数时,它会起作用。

代码语言:javascript
复制
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);

下面是输出:

票数 2
EN

Stack Overflow用户

发布于 2015-08-31 12:54:46

以防其他人也有同样的问题,我想我找到了答案。在尝试了不同的采样算法后,我发现:

  • find_MAP给出了错误答案
  • 坚果采样器给出了错误答案
  • 大都会采样器给出了正确答案,yay!

我在别的地方读到坚果采样器不适用于确定性。我也不知道原因。也许find_MAP也是这样?但现在,我将继续使用Metropolis。

票数 0
EN

Stack Overflow用户

发布于 2015-09-01 00:21:58

此外,坚果不能处理离散变量。如果你想使用坚果,你必须拆分采样器:

代码语言:javascript
复制
step1 = pymc3.NUTS([theta])
step2 = pymc3.BinaryMetropolis([X1,X2])

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

编辑:缺少内联定义的'b‘和'c’。从坚果函数调用中删除了它们

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32304160

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档