2014-01-25 6 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이 모델을 샘플링 할 때 나는 다음과 같은 결과를 얻을 :

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) 

: 나는 PYMC3와 동일 할 때

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

A q p

는하지만,이 얻을를

변수 A가 아닌 것처럼 보입니다. 전혀 샘플링되지 않습니다. pymc3에 사용 된 샘플링 방법에 대해 많이 읽지는 ​​않았지만, 연속 모델을 위해 특별히 고안된 것으로 보입니다. 이는 모델에서 관찰 할 수없는 개별 변수를 배제한다는 뜻입니까, 아니면 내가하려는 일을 수행 할 수있는 방법이 있습니까?

답변

7

NUTS 샘플러는 이산 변수에서 작동하지 않습니다 (일반화하기 위해 노력하고 있지만). 당신이 원하는 것은 다른 유형의 변수에 다른 단계 방법을 할당하는 것입니다. 예를 들면 다음과 같습니다.

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

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

나는 이와 비슷한 것으로 의심됩니다. 어쨌든 각 변수에 특정 샘플러를 추가하는 기능은 매우 좋습니다! 이 멋진 라이브러리를 가져 주셔서 감사합니다. –