正确获取pymc3中的输入尺寸
Getting input dimensions in pymc3 correct
假设我有 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 似乎期望翻转 10 次得到 50 个硬币。在这种情况下,我可以解决这个问题。但是,我都是 python 和 pymc(3) 的初学者,所以我想了解它为什么会这样,以及对这种情况的正确模拟应该是什么样子。
如果您是 Python 的新手,您可能不熟悉 broadcasting 的概念,该概念在处理 NumPy 数组时使用,对于定义 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)
假设我有 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 似乎期望翻转 10 次得到 50 个硬币。在这种情况下,我可以解决这个问题。但是,我都是 python 和 pymc(3) 的初学者,所以我想了解它为什么会这样,以及对这种情况的正确模拟应该是什么样子。
如果您是 Python 的新手,您可能不熟悉 broadcasting 的概念,该概念在处理 NumPy 数组时使用,对于定义 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)