Work with the actual hypotheses in pymc3 - 将示例从 ThinkBayes 移植到 pymc3

Work with the actual hypotheses in pymc3 - Porting examples from ThinkBayes to pymc3

我正在将 Allen Downey 在 "Think Bayes" 中介绍的一些示例复制到 pymc3。

他的好书为我们提供了一些贝叶斯方法的介绍性示例,并且是使用 Allen 自己的库完成的。

有一个"Train Problem",你需要根据你在每列火车上看到的数字(每列火车编号从1到N)来预测公司拥有的火车数量

这个问题的可能性基本是

def likelihood(self, data, hypo):
    if data > hypo:
        return 0
    return 1/hypo

for data in stream:
    for hypo in hypothesis:
        self.posterior[hypo] *= likelihood(data, hypo)

data在你在火车上看到的数字中。

如何定义自定义可能性是 pymc3?我正在使用 DensityDist 创建我自己的似然函数,但我正在复制的这个函数取决于范围从 1 到 N(假设 N = 100)的假设,而在 pymc3 中我找不到一种从张量中获取 X 的方法。

此问题也称为 German Tank problem。由于在二战期间,盟军试图根据缴获的坦克序列号来查找德国坦克的数量。

我觉得可以通过以下模型解决问题

with pm.Model() as model:
    N = pm.DiscreteUniform('N', lower=y.max(), upper=y.max()*10)
    y_obs = pm.DiscreteUniform('y', lower=0, upper=N, observed=y)

    trace = pm.sample(10000)

根据您的实际问题,您可以放宽离散假设(这是非常合理的)并使用像 Uniform 那样的连续分布。

with pm.Model() as model:
    N = pm.Uniform('N', lower=y.max(), upper=y.max()*10)
    y_obs = pm.Uniform('y', lower=0, upper=N, observed=y)

    trace = pm.sample(1000)

放宽离散假设的一个好处是现在您可以使用 NUTS。相反,在之前的模型中,由于您使用的是离散变量,因此您只能使用 Metropolis。