【问题标题】:Work with the actual hypotheses in pymc3 - Porting examples from ThinkBayes to pymc3使用 pymc3 中的实际假设 - 将示例从 ThinkBayes 移植到 pymc3
【发布时间】:2016-06-05 15:39:57
【问题描述】:

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

他的好书为我们提供了一些贝叶斯方法的介绍性示例,并使用艾伦自己的图书馆完成。

有一个“火车问题”,你需要根据你看到的每辆火车上的数字来预测公司拥有的火车数量(每辆火车的编号从 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。

【问题讨论】:

    标签: pymc3


    【解决方案1】:

    这个问题也被称为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,因为您使用的是离散变量。

    【讨论】:

    • 你确定'N'中的下参数应该是y.max()而不是0吗?如果是,为什么?
    • 嗨。原因是我知道至少 y.max() 坦克/火车存在。所以问题的解应该是一个等于或大于y.max()的数
    猜你喜欢
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 2017-07-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-27
    • 2017-06-13
    • 1970-01-01
    相关资源
    最近更新 更多