PyMC3 намного медленнее, чем PyMC в метрополии - PullRequest
0 голосов
/ 27 декабря 2018

Я пытаюсь сравнить скорость выборки между 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,7 с

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 голосов
/ 18 января 2019

Это нормально!PyMC3 оптимизирован для запуска NUTS, алгоритма MCMC для непрерывных моделей, который на несколько порядков более эффективен, чем Metropolis, для выборки из иерархических моделей.И наоборот, pymc написан на фортране, который обеспечивает некоторые ускорения по сравнению с jano-кодом из pymc3 и, возможно, более глубоко заботится о таких алгоритмах, как Metropolis.

...