我试图从随机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 ...
我错过了什么?
答案 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)