PyMC的并行化
有人能给一些关于如何让 PyMC MCMC
代码并行运行的基本指导吗?我正在尝试运行 LASSO
回归,参考的是这里的例子。我看到有地方说并行采样是默认进行的,但我还需要使用像 Parallel Python
这样的工具来让它工作吗?
这里有一些我希望能够在我的机器上并行化的参考代码。
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)
2 个回答
11
PYMC3把psample合并到了sample里。
如果想要并行运行,可以把参数设置为njobs > 1
。
使用pymc.sample函数的方法是:
sample(draws, step, start=None, trace=None, chain=0, njobs=1, tune=None,
progressbar=True, model=None, random_seed=None)
注意,如果你把njobs=None
设置成这样,它会默认使用CPU数量减去2。
希望这对你有帮助。
12
看起来你在使用PyMC2,按照我所知道的,你需要用一些Python的方法来进行并行计算,比如IPython.parallel。有很多种方法可以做到这一点,但我知道的那些方法都有点复杂。这里有一个例子,它使用了PyMC2、IPCluster和Wakari。
在PyMC3中,并行采样是通过psample
这个方法来实现的,不过你的参考代码需要更新为PyMC3的格式:
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)