在都市采样中,PyMC3比PyMC慢得多

时间:2018-12-27 18:36:57

标签: bayesian sampling pymc3 pymc mcmc

我正在尝试比较PyMC和PyMC3之间的采样速度。

PyMC:

p1 = pymc.Normal('p1', 10, 0.5)
p2 = pymc.Gamma('p2', 11, 5)
p3 = pymc.Normal('p3', p1, p2)
model = pymc.Model([p1, p2, p3])

mcmc = pymc.MCMC(model)
mcmc.use_step_method(pymc.Metropolis, p1, p2, p3)
mcmc.sample(10000, progress_bar=True)

这花了2.7s

PyMC3:

with pm.Model() as model:
    p1 = pm.Normal('p1', 10, 0.5)
    p2 = pm.Gamma('p2', 11, 5)
    p3 = pm.Normal('p3', p1, p2)
    steps = pm.Metropolis(vars=[p1, p2, p3])
    trace = pm.sample(10000,step=steps, progressbar=True)

这花了6.6秒

这正常吗?我是否缺少PyMC3的一些优化技巧?

1 个答案:

答案 0 :(得分:1)

这很正常! PyMC3针对运行NUTS进行了优化,NUTS是一种用于连续模型的MCMC算法,从分层模型中进行采样比Metropolis效率高出几个数量级。相反,pymc用fortran编写,与py​​mc3中的jitted theano代码相比,提速了一些,也许更在意诸如Metropolis之类的算法。