获取pymc3中的输入维度是正确的

时间:2016-05-30 17:15:13

标签: python bayesian pymc mcmc pymc3

假设我有10枚来自同一薄荷的硬币,我每次翻转50次,现在我想估计薄荷的偏差以及所有硬币的个别偏差。

我想这样做的方式是这样的:

# Generate a list of 10 arrays with 50 flips in each
test = [bernoulli.rvs(0.5, size=50) for x in range(10)]

with pm.Model() as test_model:
    k = pm.Gamma('k', 0.01, 0.01) + 2
    w = pm.Beta('w', 1, 1)

thetas = pm.Beta('thetas', w * (k - 2) + 1, (1 - w) * (k - 2) + 1, shape = len(test))
y = pm.Bernoulli('y', thetas, observed=test)

但是这不起作用,因为现在看来pymc预计有50个硬币和10个翻转。在这种情况下,我可以解决这个问题。但是,我既是python和pymc(3)的初学者,所以我想了解它为什么会这样,以及对这种情况的正确模拟应该是什么样的。

1 个答案:

答案 0 :(得分:1)

如果您是Python新手,可能您不熟悉使用NumPy数组时使用的broadcasting概念,并且对定义PyMC3模型也很有用。广播使我们能够在某些情况下使用不同大小的数组进行算术运算。

对于您的特定示例,问题在于根据广播规则,数据向量的形状和 thetas向量的形状不兼容。解决问题的最简单方法是转置数据向量(使行列和列行)。 另请注意,使用SciPy可以在不使用列表推导的情况下创建模拟数据,只需要传递正确的形状。

test = bernoulli.rvs(0.5, size=(50, 10))


with pm.Model() as test_model:
    k = pm.Gamma('k', 0.01, 0.01) + 2
    w = pm.Beta('w', 1, 1)
    thetas = pm.Beta('thetas', w * (k - 2) + 1, (1 - w) * (k - 2) + 1, shape = test.shape[1])
    y = pm.Bernoulli('y', thetas, observed=test)