BetaBinomial 和 "Beta and Binomial" 之间的区别
Difference between BetaBinomial and "Beta and Binomial"
我在 pymc3
中创建了两个模型。一个是 pm.BetaBinomial
,另一个是 pm.Beta
和 pm.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.Beta
和 pymc3.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
中创建了两个模型。一个是 pm.BetaBinomial
,另一个是 pm.Beta
和 pm.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.Beta
和 pymc3.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 采样器真正拟合高维模型。