Ошибка нулевой вероятности PYMC2

У меня есть модель с 6 параметрами с одинаковыми приорами:

parameter1 = pm.Uniform('parameter1',0.01,1)
parameter2 = pm.Uniform('parameter2',0,2)
parameter3 = pm.DiscreteUniform('parameter3',1,50)
parameter4 = pm.Uniform('parameter4',0,1.75)
parameter5 = pm.Uniform('parameter5', 0.005, 0.25)
parameter6 = pm.Uniform('parameter6', 0.005, 0.15)

У меня есть пользовательская функция правдоподобия, которая возвращает значение правдоподобия журнала:

@pm.potential
def log_l(experiment=experiment,parameter1=parameter1,parameter2=parameter2,parameter3=parameter3,parameter4=parameter4,parameter5=parameter5,parameter6=parameter6):

    if parameter5<parameter4:
        return -np.inf

    parameters=[parameter1, parameter2, parameter3]

    log_l=calculate_probability(parameters, t_m, tol, n_integration, parameter4, parameter5, parameter6, experiment.decon_all[freq,:,:])

    return log_l

куда calculate_probability это моя функция, которая возвращает логарифмическую вероятность для этой модели с учетом значений параметров и данных наблюдений. По какой-то причине, когда образцы MCMC:

model = pm.MCMC([parameter1,parameter2,parameter3,parameter4,parameter5,parameter6,log_l])
model.sample(100)

и программа удовлетворяет условию if (parameter5<parameter4) Я получаю эту ошибку:

pymc.Node.ZeroProbability: Potential log_l forbids its parents' current values

Мне было интересно, если кто-нибудь знает, что я могу делать не так?

1 ответ

Решение

Согласно документам:

Потенциалы имеют один важный атрибут, logp, журнал их текущей вероятности или значение плотности вероятности с учетом значений их родителей. Единственный другой дополнительный интересный атрибут parentsсловарь, содержащий потенциальных родителей.

Так что родители твои log_l аргументы log_l:

In [11]: list(log_l.parents.keys())
Out[11]: ['experiment', 'parameter2', 'parameter3', 'parameter1', 'parameter4', 
          'parameter6', 'parameter5']

За этот ответ (мой акцент):

Когда случайная переменная определяется как функция другой случайной переменной, PyMC проверяет, что никакое значение родительского распределения не приводит к невозможному значению для дочернего распределения.

Изготовление log_l вернуть -np.inf подразумевает, что определенные значения родительских переменных невозможны. Следовательно, PyMC поднимает ZeroProbability исключение.


Таким образом, вместо ограничения модели с помощью

if parameter5<parameter4:
    return -np.inf

вы могли бы определить parameter5 с

parameter4 = pm.Uniform('parameter4', 0, 1.75)
parameter5 = pm.Uniform('parameter5', parameter4, 0.25)

чтобы убедиться, что parameter5 > parameter4,

Другие вопросы по тегам