2014-01-25 59 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。 –