Python PyMC2和PyMC3给出了不同的结果。。。?

Python PyMC2和PyMC3给出了不同的结果。。。?,python,pymc,pymc3,Python,Pymc,Pymc3,我正在尝试让一个简单的PyMC2模型在PyMC3中工作。我已经让模型运行了,但是模型对变量给出了非常不同的MAP估计。这是我的PyMC2模型: 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 =

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

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对θ的MAP估计值约为0.68(正确),而PyMC3给出的估计值约为0.26(不正确)。我怀疑这与我定义确定性函数的方式有关。PyMC3不允许我使用lambda函数,所以我只需要在线编写表达式。当我尝试使用λθ=θ:。。。我得到这个错误:

AsTensorError: ('Cannot convert <function <lambda> at 0x157323e60> to TensorType', <type 'function'>)
AsTensorError:(“无法转换为TensorType”,)

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

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

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

我在别的地方读到坚果采样器不适用于确定性。我不知道为什么。也许find_MAP也是这样?但现在我将坚持使用Metropolis。

当你在确定性模型中使用theano
张量而不是numpy函数时,它会起作用

导入pymc3
将无张量导入为tt
使用pymc3.Model()作为模型:
θ=pymc3.正常('θ',0,0.88)
X1=pymc3.Bernoulli('X1',p=pymc3.Deterministic('b',1./(1+tt.exp(-(θ-(-0.75-))))),观测值=[1])
X2=pymc3.Bernoulli('X2',p=pymc3.Deterministic('c',1./(1+tt.exp(-(θ-(0-)))),观测值=[1])
start=pymc3.find_MAP()
步骤=pymc3.螺母(状态=开始)
trace=pymc3.sample(20000,步长,njobs=1,progressbar=True)
打印“\nθ的映射值为”,np.中值(轨迹['θ])
pymc3.追踪图(trace);
以下是输出:


此外,螺母不处理离散变量。如果要使用坚果,必须将取样器分开:

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

trace = pymc3.sample(10000, [step1, step2], start)
编辑:
遗漏了“b”和“c”是内联定义的。从NUTS函数调用中删除它们

映射值不是定义为分布的平均值,而是定义为分布的最大值。使用
pymc2
您可以通过以下方式找到它:

M = pymc.MAP(model)
M.fit()
theta.value
返回
数组(0.6253614422469552)

这与您在
pymc3
中使用
find\u MAP
找到的映射一致,您称之为
start

{'theta': array(0.6253614811102668)}
哪个采样器更好的问题是另一个问题,不取决于地图的计算。MAP计算是一种优化。
请参阅:对于
pymc2

此代码引发以下错误
NameError:未定义名称“b”
当定义
step1
时,使用相同的代码时,我会得到一个类似的跟踪中值,但在find\u MAP()中没有得到相同的值。我的find_MAP()返回~0.27。