PyMC: получение нуля или значения, близкого к нулю
Я пытаюсь оценить ставки по стохастической модели Петри. Я не понимаю, почему, но я получаю ошибку ZeroProbability даже при составлении данных, которые точно соответствуют ожидаемому количеству наблюдений с учетом начальных значений, которые я определяю для скоростей.
Например, следующие показатели [0,01, 2, 10, 1] соответствуют вероятности 3 различных исходов [0,33, 0,66, 0,01]. Если бы я наблюдал, 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 ответ
Я понял, что проблема заключается в разнице между категориальным распределением и многочленным распределением. Я изо всех сил пытался найти фактическую разницу между ними и, наконец, нашел ее здесь:
Категориальное распределение эквивалентно полиномиальному распределению с числом испытаний, равным единице.
Следовательно, Категориальная вероятность имеет только вероятности различных результатов в качестве параметра и принимает частоты в качестве наблюдаемых данных.
С другой стороны, мультиномиальное распределение принимает вероятности различных результатов И количество испытаний в качестве параметров и принимает количество наблюдений за результат в качестве данных.
Следующий код работает как я ожидал:
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)