2014-01-25 85 views
5

我更新了一些計算,我曾經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

堅果採樣不與離散變量工作(雖然人們都在推廣它這樣做的工作)。你想要做的是將不同的步驟方法分配給不同類型的變量。例如:

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

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

我懷疑是這樣的。總之,具體採樣添加到每個變量的能力是非常好的!感謝這個偉大的lib。 –