PyMC:获得零或接近零的分类可能性

时间:2014-09-18 09:22:56

标签: distribution pymc

我试图从随机Petri网模型中估算出利率。我不明白为什么,但是我得到了一个ZeroProbability Error,即使在给出我为费率定义的初始值时,数据数据与预期的观察数完全对应。

例如,以下比率[0.01,2,10,1]对应于[0.33,0.66,0.01]的3种不同结果的概率。如果我观察到100个结果,我希望观察到[33,66,1]属于每个结果。

然而,如果我运行以下模型,我会得到一个ZeroProbability错误(我正在简化prob函数,它连接到更大的代码片段):

data=[33,66,1]
rates=pymc.Uniform('rates',0,100,size=4,value=[0.01,2,10,1])

@pymc.deterministic
def prob(rates=rates):
    return np.array([0.33,0.66,0.01])

likelihood=pymc.Categorical('likelihood',p=prob,value=data,observed=True)

调用pymc.categorical_like(data,prob.value)返回-1.8 e308 ...

我错过了什么?

1 个答案:

答案 0 :(得分:1)

我发现问题是分类分布和多项分布之间的区别。我一直在努力寻找两者之间的实际差异,最后找到它here

  

分类分布等同于多项分布,试验次数等于一。

因此,分类似然只有不同结果的概率作为参数,并将频率作为观察数据。

另一方面,多项分布将不同结果的概率和试验次数作为参数,并将每个结果的观察次数作为数据。

以下代码按预期工作:

data=np.array([33,66,1])
rates=pymc.Uniform('rates',0,100,size=4,value=[0.01,2,10,1])

@pymc.deterministic
def prob(rates=rates):
    return np.array([0.33,0.66,0.01])

likelihood=pymc.Multinomial('likelihood',n=sum(data),p=prob,value=data,observed=True)

以下两个概率非常相似:

pymc.categorical_like(data/data.sum(),prob.value)
pymc.multinomial_like(data,sum(data),prob.value)