使用pymc3中的实际假设 - 将示例从ThinkBayes移植到pymc3

时间:2016-06-05 15:39:57

标签: pymc3

我正在复制" Think Bayes"中提出的一些例子。艾伦唐尼对pymc3。

他的伟大着作为我们提供了贝叶斯方法的一些介绍性例子,并使用了艾伦自己的图书馆。

有#34;火车问题",你需要根据你在每列火车上看到的数字来预测一家公司的列车数量(每列火车的编号从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的方法。

1 个答案:

答案 0 :(得分:2)

此问题也称为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。