我正在尝试比较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的一些优化技巧?
答案 0 :(得分:1)
这很正常! PyMC3针对运行NUTS进行了优化,NUTS是一种用于连续模型的MCMC算法,从分层模型中进行采样比Metropolis效率高出几个数量级。相反,pymc
用fortran编写,与pymc3中的jitted theano代码相比,提速了一些,也许更在意诸如Metropolis之类的算法。