python - PyMC2 和 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 = 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 的 MAP 估计值约为 0.68(正确),而 PyMC3 给出的估计值约为 0.26(不正确)。我怀疑这与我定义确定性函数的方式有关。 PyMC3 不允许我使用 lambda 函数,因此我只需内联编写表达式即可。当我尝试使用 lambda theta=theta:... 时出现此错误:

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

与 Theano 有关吗?任何建议将不胜感激!

最佳答案

当您在确定性中使用 theano 张量 而不是 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

关于python - PyMC2 和 PyMC3 给出不同的结果......?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32304160/

相关文章:

python - 在不制作文件的情况下使用 Imagemagick?

python multiprocessing.Process.terminate - 如何杀死子进程

python-3.x - 在 debian sid 上安装 pymc 时出错

python - PyMC3 多项式模型不适用于非整数观察数据

pymc - 如何在PyMC3中采样多个链

python - 存储日期 <= 最后 24 小时时 Django 返回计数

python - 如何使用python访问任何网站的搜索框?

python - 如何加速 PyMC 马尔可夫模型?

python - PyMC3 将随机协方差矩阵传递给 pm.MvNormal()

python - concat() 得到一个意外的关键字参数 'join_axes'