2014-09-18 4 views
2

Я пытаюсь оценить ставки из стохастической модели Petri Net. Я не понимаю, почему, но я получаю ошибку ZeroProbability, даже когда составляю данные данных, чтобы точно соответствовать ожидаемому числу наблюдений, учитывая начальные значения, которые я определяю для ставок.PyMC: Получение нулевого или близкого к нулю категориального правдоподобия

Например, следующие ставки [0,01, 2, 10, 1] соответствуют вероятности трех разных результатов [0,33, 0,66, 0,01]. Если бы я наблюдал, 100 результатов, я бы ожидал заметить, что [33, 66, 1] попадают в каждый из результатов.

Но если я запускаю следующую модель, я получаю ошибку ZeroProbability (я упрощая функцию Проб, который подключается к гораздо большей части кода):

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 (данные , prob.value) возвращает -1.8 e308 ...

Что мне не хватает?

ответ

0

Я выяснил, что проблема заключалась в различии между категориальным распределением и многокомпонентным распределением. Я изо всех сил на поиск фактической разницы между ними и, наконец, нашел его 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) 
+0

Я уверен, что мультиномиальный лучше для моего случая. Но я не совсем уверен, в каких случаях категориальное распределение лучше ... – Delphine

+1

Категориальное было бы уместно для ситуаций, когда, например, вы пытаетесь присвоить ярлык из набора неупорядоченных меток вероятностно элементу. Если есть k меток, то образец из категориального значения будет давать значения в '{0,1, ..., k-1}'. –