2014-12-12 5 views
6

Я пытаюсь пробовать несколько цепей в PyMC3. В PyMC2 я хотел бы сделать что-то вроде этого:Как пробовать несколько цепей в PyMC3

for i in range(N): 
    model.sample(iter=iter, burn=burn, thin = thin) 

Как я должен сделать то же самое в PyMC3? Я видел, что в методе «образец» есть аргумент «njobs», но он порождает ошибку, когда я устанавливаю для нее значение. Я хочу использовать выборочные цепочки для получения вывода «pymc.gelman_rubin».

+0

'njobs' это способ сделать это. Вы должны [открыть проблему] (https://github.com/pymc-devs/pymc/issues) об ошибке, которую вы видите. –

+0

На самом деле, я также получаю сообщение об ошибке. Выведет вопрос. –

+0

'nojobs', как мне кажется (хотя и делает ошибку), пытается запустить цепочки многопоточным/многопроцессорным способом. Я хочу запускать их одним способом. В любом случае, чтобы это сделать? –

ответ

4

Чтобы запустить их серийно, вы можете использовать аналогичный подход к вашему примеру 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)]) 
+0

спасибо @KyleMeyer; он работает так, как я хотел –

9

Лучше использовать 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) 
Смежные вопросы