Как сэмплировать несколько цепочек в PyMC3
Я пытаюсь сэмплировать несколько цепочек в PyMC3. В PyMC2 я бы сделал что-то вроде этого:
for i in range(N):
model.sample(iter=iter, burn=burn, thin = thin)
Как мне сделать то же самое в PyMC3? Я видел аргумент njobs в методе sample, но он выдает ошибку, когда я устанавливаю для него значение. Я хочу использовать цепочки сэмплов, чтобы получить вывод 'pymc.gelman_rubin'.
2 ответа
Решение
Чтобы запустить их последовательно, вы можете использовать подход, аналогичный вашему примеру PyMC 2. Основное отличие состоит в том, что каждый звонок sample
возвращает экземпляр многоцепочечной трассировки (в данном случае содержащий только одну цепочку). merge_traces
возьмет список экземпляров с несколькими цепочками и создаст один экземпляр со всеми цепочками.
#!/usr/bin/env python3
import pymc as pm
import numpy as np
from pymc.backends.base import merge_traces
xobs = 4 + np.random.randn(20)
model = pm.Model()
with model:
mu = pm.Normal('mu', mu=0, sd=20)
x = pm.Normal('x', mu=mu, sd=1., observed=xobs)
step = pm.NUTS()
with model:
trace = merge_traces([pm.sample(1000, step, chain=i)
for i in range(2)])
Лучше использовать njobs
запускать цепочки параллельно:
#!/usr/bin/env python3
import pymc3 as pm
import numpy as np
from pymc3.backends.base import merge_traces
xobs = 4 + np.random.randn(20)
model = pm.Model()
with model:
mu = pm.Normal('mu', mu=0, sd=20)
x = pm.Normal('x', mu=mu, sd=1., observed=xobs)
step = pm.NUTS()
with model:
trace = pm.sample(1000, step, njobs=2)