2014-12-12 16 views
6

Ich versuche, mehrere Ketten in PyMC3 zu probieren. In PyMC2 würde ich etwas wie dieses tun:Wie mehrere Ketten in PyMC3 Probe

Wie soll ich dasselbe in PyMC3 tun? Ich habe gesehen, dass es ein "njobs" -Argument in der "sample" -Methode gibt, aber es wird ein Fehler ausgegeben, wenn ich einen Wert dafür festlege. Ich möchte Sampling-Ketten verwenden, um "pymc.gelman_rubin" -Ausgabe zu erhalten.

+0

'njobs' die Art und Weise, es zu tun ist. Sie sollten [ein Problem] (https://github.com/pymc-devs/pymc/issues) über den Fehler, den Sie sehen, öffnen. –

+0

Eigentlich bekomme ich auch hier einen Fehler. Wird ein Problem veröffentlichen. –

+0

'nojobs', wie es mir scheint (obwohl es einen Fehler wirft), versucht, Ketten in einer Multithread/Multiprozess-Art zu betreiben. Ich möchte sie auf eine einzige Art und Weise ausführen. Wie auch immer, das zu tun? –

Antwort

4

Um sie seriell auszuführen, können Sie einen ähnlichen Ansatz für Ihr PyMC 2 Beispiel verwenden. Der Hauptunterschied besteht darin, dass jeder Aufruf an sample eine Multi-Chain-Trace-Instanz zurückgibt (die nur eine einzige Kette in diesem -Fall enthält). merge_traces nimmt eine Liste von mehrkettigen Instanzen und erstellt eine einzelne Instanz mit allen Ketten.

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

danke @KyleMeyer; es funktioniert so, wie ich es wollte –

9

Besser ist njobs zu verwenden Ketten parallel laufen zu lassen:

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