如何在PyMC3中对多个链进行采样

时间:2014-12-12 15:22:36

标签: pymc pymc3

我试图在PyMC3中对多个链进行采样。在PyMC2中我会做这样的事情:

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

我应该如何在PyMC3中做同样的事情?我看到有一个'njobs' '样本中的论点'方法,但是当我为它设置一个值时会抛出一个错误。我想使用采样链来获得pymc.gelman_rubin'输出

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分: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)])