BetaBinomial与“Beta和Binomial”之间的区别

时间:2017-04-30 19:16:07

标签: pymc3

我在pymc3创建了两个模型。一个是pm.BetaBinomial,另一个是pm.Betapm.Binomial

如果我们使用pymc3.BetaBinomial,$ \ alpha $和$ \ beta $ converge。

import numpy as np
from scipy.stats import binom, beta
import pymc3 as pm
%matplotlib inline

np.random.seed(42)
''' we have values of X and n '''
n_data = np.random.randint(10, 30, size=1000)
x_data = binom.rvs(n_data, beta.rvs(10, 20, size=1000))

with pm.Model() as model0:
    alpha0 = pm.Uniform('alpha', 1, 100)
    beta0 = pm.Uniform('beta', 1, 100)
    X0 = pm.BetaBinomial('X', alpha=alpha0, beta=beta0, n=n_data, observed=x_data)
    trace0 = pm.sample(25000, step=pm.Metropolis(vars=[alpha0, beta0, X0]))

enter image description here

但如果我们合并pymc3.Betapymc3.Binomial,那么$ \ beta $似乎不会收敛,并且跟踪看起来非常不同。 (注意$ \ alpha = 10 $和$ \ beta = 20 $。)

with pm.Model() as model1:
    alpha1 = pm.Uniform('alpha', 1, 100)
    beta1 = pm.Uniform('beta', 1, 100)
    p1 = pm.Beta('prob', alpha=alpha1, beta=beta1)
    X1 = pm.Binomial('X1', n=n_data, p=p1, observed=x_data)
    trace1 = pm.sample(25000, step=pm.Metropolis(vars=[alpha1, beta1, p1, X1]))

enter image description here

为什么会出现上述差异?以上两种模型在理论上是等效的。所以我认为我对pymc3的使用存在问题。

1 个答案:

答案 0 :(得分:3)

每个样本都需要单独的pshape参数是新的):

with pm.Model() as model1:
    alpha1 = pm.Uniform('alpha', 1, 100)
    beta1 = pm.Uniform('beta', 1, 100)
    p1 = pm.Beta('prob', alpha=alpha1, beta=beta1, shape=1000)
    X1 = pm.Binomial('X1', n=n_data, p=p1, observed=x_data)
    trace1 = pm.sample(2000, tune=1000)

我也切换到了NUTS。使用Metropolis采样器无法真正适应高维模型。