2014-05-07 14 views
8

Könnte jemand einige allgemeine Anweisungen geben, wie man den PyMC MCMC Code parallelisieren kann. Ich versuche LASSO Regression nach dem Beispiel here laufen zu lassen. Ich habe irgendwo gelesen, dass paralleles Sampling standardmäßig ausgeführt wird, aber muss ich noch etwas wie Parallel Python verwenden, damit es funktioniert?Parallelisierung von PyMC

Hier ist ein Referenzcode, den ich auf meinem Rechner parallelisieren möchte.

x1 = norm.rvs(0, 1, size=n) 
x2 = -x1 + norm.rvs(0, 10**-3, size=n) 
x3 = norm.rvs(0, 1, size=n) 

X = np.column_stack([x1, x2, x3]) 
y = 10 * x1 + 10 * x2 + 0.1 * x3 

beta1_lasso = pymc.Laplace('beta1', mu=0, tau=1.0/b) 
beta2_lasso = pymc.Laplace('beta2', mu=0, tau=1.0/b) 
beta3_lasso = pymc.Laplace('beta3', mu=0, tau=1.0/b) 

@pymc.deterministic 
def y_hat_lasso(beta1=beta1_lasso, beta2=beta2_lasso, beta3=beta3_lasso, x1=x1, x2=x2, x3=x3): 
    return beta1 * x1 + beta2 * x2 + beta3 * x3 

Y_lasso = pymc.Normal('Y', mu=y_hat_lasso, tau=1.0, value=y, observed=True) 

lasso_model = pymc.Model([Y_lasso, beta1_lasso, beta2_lasso, beta3_lasso]) 
lasso_MCMC = pymc.MCMC(lasso_model) 
lasso_MCMC.sample(20000,5000,2) 

Antwort

9

Es sieht aus wie Sie PyMC2 verwenden, und soweit ich weiß, müssen Sie einige Python-Ansatz verwenden Berechnung parallel, wie IPython.parallel. Es gibt viele Möglichkeiten, dies zu tun, aber alle, die ich kenne, sind ein bisschen kompliziert. Hier ist an example of one, which uses PyMC2, IPCluster, and Wakari.

In PyMC3 parallele Abtastung wird in der psample Methode implementiert, aber Ihr Referenzcode muß das PyMC3 Format aktualisiert werden:

with pm.Model() as model: 
    beta1 = pm.Laplace('beta1', mu=0, b=b) 
    beta2 = pm.Laplace('beta2', mu=0, b=b) 
    beta3 = pm.Laplace('beta3', mu=0, b=b) 

    y_hat = beta1 * x1 + beta2 * x2 + beta3 * x3 
    y_obs = pm.Normal('y_obs', mu=y_hat, tau=1.0, observed=y) 

    trace = pm.psample(draws=20000, step=pm.Slice(), threads=3) 
8

PYMC3 den PSAMPLE verschmolzen in Probe.

Um parallel zu arbeiten, den Parameter njobs > 1 einstellen.

Die Verwendung für die pymc.sample Funktion ist:

sample(draws, step, start=None, trace=None, chain=0, njobs=1, tune=None, progressbar=True, model=None, random_seed=None) Hinweis, wenn Sie njobs=None gesetzt ist, wird es zu Anzahl der CPUs Standard - 2.

Ich hoffe, das hilft.

Verwandte Themen