pymc3 - BetaBinomial 和 "Beta and Binomial"之间的区别

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

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

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]))

但如果我们将 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]))

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

最佳答案

每个样本都需要一个单独的 p(shape 参数是新的):

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 采样器真正拟合高维模型。

关于pymc3 - BetaBinomial 和 "Beta and Binomial"之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43710346/

相关文章:

ibm-midrange - 在 AS400 中的程序之间传递可选参数

haskell - 在 where 子句中指定函数的类型

visual-c++ - 访问 CBitmap 对象中的单个像素

centos7 - 在 LVM 之上扩展 GlusterFS

react-native - redux-observable 获取当前位置

nginx - 使用 logrotate 容器化 nginx 日志轮换

wifi - Arduino 非阻塞 Wifi 连接

angularjs-material - 如何翻译 md-datepickers "Invalid

pandas - Pyspark - 如何回填 DataFrame?

list - 类型 ('a -> ' b) list 的函数 -> OCaml 中的 'a -> '