Трудности на pymc3 по сравнению с pymc2, когда задействованы дискретные переменные

Я обновляю некоторые расчеты, в которых я использовал pymc2 для pymc3, и у меня возникают некоторые проблемы с поведением сэмплеров, когда у меня есть некоторые дискретные случайные переменные в моей модели. В качестве примера рассмотрим следующую модель с использованием pymc2:

import pymc as pm

N = 100
data = 10

p = pm.Beta('p', alpha=1.0, beta=1.0)
q = pm.Beta('q', alpha=1.0, beta=1.0) 
A = pm.Binomial('A', N, p)
X = pm.Binomial('x', A, q, observed=True, value=data)

На самом деле это ничего не репрезентативно, это просто модель, в которой одна из ненаблюдаемых переменных является дискретной. Когда я пробую эту модель с помощью pymc2, я получаю следующие результаты:

mcmc = pm.MCMC(model)
mcmc.sample(iter=100000, burn=50000, thin=100)
plot(mcmc)

Aq p

Но когда я пытаюсь сделать то же самое с PYMC3, я получаю следующее:

with pm.Model() as model:
    N = 100
    p = pm.Beta('p', alpha=1.0, beta=1.0)
    q = pm.Beta('q', alpha=1.0, beta=1.0) 
    A = pm.Binomial('A', N, p)
    X = pm.Binomial('x', A, q, observed=10)

with model:
    start = pm.find_MAP()

with model:
    step = pm.NUTS()
    trace = pm.sample(3000, step, start)

pm.traceplot(trace)

qa

Похоже, что переменная A вообще не сэмплируется. Я мало читал о методе выборки, используемом в pymc3, но заметил, что он, похоже, особенно нацелен на непрерывные модели. Означает ли это, что он исключает дискретные ненаблюдаемые переменные в модели или есть какой-то способ сделать то, что я пытаюсь сделать?


person Rafael S. Calsaverini    schedule 25.01.2014    source источник


Ответы (1)


Сэмплер NUTS не работает с дискретными переменными (хотя люди работают над его обобщением для этого). Что вы хотели бы сделать, так это назначить разные пошаговые методы для разных типов переменных. Например:

step1 = pm.NUTS(vars=[p, q])
step2 = pm.Metropolis(vars=[A])

trace = pm.sample(3000, [step1, step2], start)
person Chris Fonnesbeck    schedule 27.01.2014
comment
Я подозревал, что это что-то вроде этого. В любом случае, возможность добавлять определенные сэмплеры к каждой переменной — это очень удобно! Спасибо за эту замечательную библиотеку. - person Rafael S. Calsaverini; 27.01.2014