问题:PyMC3中的链是什么?

我正在学习用于贝叶斯建模的 PyMC3。您可以使用以下方法创建模型和样本:

import pandas as pd
import pymc3 as pm

# obs is a DataFrame with a single column, containing
# the observed values for variable height
obs = pd.DataFrame(...)

# we create a pymc3 model
with pm.Model() as m:
    mu = pm.Normal('mu', mu=178, sd=20)
    sigma = pm.Uniform('sigma', lower=0, upper=50)
    height = pm.Normal('height', mu=mu, sd=sigma, observed=obs)
    trace = pm.sample(1000, tune=1000)

pm.traceplot(trace)

pymc3 输出

当我检查trace(在本例中是来自后验概率的 1000 个样本)时,我注意到创建了 2 个链:

>>> trace.nchains
2

我阅读了有关 PyMC3 的教程并查看了 API,但我不清楚链代表什么(在这种情况下,我要求从后部获取 1000 个样本,但我得到了 2 个链,每个链都有来自后部的 1000 个样本)。

采样器的链是否具有相同参数的不同运行,或者它们是否具有其他含义/目的?

解答

链是单次运行的 MCMC。因此,如果您的模型中有六个二维参数并要求 1000 个样本,您将获得 each 链的六个 2x1000 数组。

运行 MCMC 时,最好使用多个链,因为它们可以帮助诊断问题。例如,Gelman-Rubin 诊断需要多个链,如果您在PyMC3中使用超过 1 个链,它会自动运行(使用joblib,如果可能,它会尝试使用多个内核)。

作为何时可能需要多个链的具体示例,请考虑从多峰分布中采样。即使是NUTS采样器也可能不会在单个链中访问这两种模式,但您可以使用多个链来诊断这一点。

多链

请注意,PyMC3通常会在您使用它们时组合链(例如,使用trace.get_values('my_var')),因为它们都是有效的 MCMC 样本。这确实会导致一些令人困惑的行为,因为在大多数系统上要求 1000 个样本实际上会得到 4000 个样本,默认情况下你会得到 4 个链。

Logo

学AI,认准AI Studio!GPU算力,限时免费领,邀请好友解锁更多惊喜福利 >>>

更多推荐