假设我有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)的初学者,所以我想了解它为什么会这样,以及对这种情况的正确模拟应该是什么样的。
答案 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)