Как сэмплировать несколько цепочек в 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)
Другие вопросы по тегам