2014-01-25 4 views
5

Я обновляю некоторые вычисления, где я использовал pymc2 для pymc3, и у меня возникают некоторые проблемы с поведением пробоотборников, когда у меня есть некоторые дискретные случайные величины на моей модели. В качестве примера рассмотрим следующую модель с использованием 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) 

A q 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) 

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

ответ

7

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

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

trace = pm.sample(3000, [step1, step2], start) 
+0

Я подозревал, что это что-то вроде этого. Во всяком случае, возможность добавлять определенные пробоотборники к каждой переменной очень хороша! Спасибо за эту большую библиотеку. –