我正在复制艾伦·唐尼( Allen )在“想想贝斯”(Think)中向pymc3展示的一些例子。
他的伟大著作为我们提供了一些关于贝叶斯方法的介绍性例子,并且是使用Allen自己的库完成的。
有一个“火车问题”,你需要根据你在每列火车上看到的数量来预测一家公司的列车数量(每列列车编号从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的方法。
发布于 2016-06-17 16:48:57
这个问题也被称为德国坦克问题。自从第二次世界大战期间,盟军就试图根据被俘坦克的编号来寻找德国坦克的数量。
我认为这个问题可以用下面的模型来解决
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)
放松离散假设的一个好处是现在你可以使用坚果了。相反,在以前的模型中,由于您使用的是离散变量,所以您被限制在大都会。
https://stackoverflow.com/questions/37643697
复制相似问题