我正在复制" 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的方法。
答案 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。