2014-12-12 20 views
6

Próbuję próbkować wiele łańcuchów w PyMC3. W PyMC2 chciałbym zrobić coś takiego:jak próbkować wiele łańcuchów w PyMC3

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

Jak powinienem zrobić to samo w PyMC3? Widziałem, że istnieje argument "njobs" w metodzie "próbka", ale generuje on błąd, gdy ustawiam dla niego wartość. Chcę użyć łańcuchów próbkowanych, aby uzyskać wyjście "pymc.gelman_rubin".

+0

'njobs' jest sposób, aby to zrobić. Powinieneś [otworzyć problem] (https://github.com/pymc-devs/pymc/issues) na temat błędu, który widzisz. –

+0

Właściwie to mam tu również błąd. Publikuje problem. –

+0

"nojobs", jak mi się wydaje (choć wyrzuca błąd), próbuje uruchomić łańcuchy w trybie wielowątkowym/wieloprocesowym. Chcę uruchomić je w sposób jednoprocesowy. W każdym razie to zrobić? –

Odpowiedz

4

Aby uruchomić je seryjnie, można zastosować podobne podejście do przykładu PyMC 2 . Główną różnicą jest to, że każde wywołanie do sample zwraca instancję śledzenia wielu łańcuchów (zawierającą tylko jeden łańcuch w tej obudowie ). merge_traces zrobi listę instancji wielołańcuchowych i utworzy pojedynczą instancję ze wszystkimi łańcuchami.

#!/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

dzięki @KyleMeyer; działa tak, jak chciałem –

9

Lepiej jest używać njobs uruchomić łańcuchy równolegle:

#!/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)