PyMC3 中的链是什么?

What is a chain in 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)

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

>>> trace.nchains
2

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

链条是使用相同参数的采样器的不同运行还是它们有一些其他的meaning/purpose?

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

运行宁 MCMC 时,最好使用多个链,因为它们可以帮助诊断问题。例如,Gelman-Rubin diagnostic 需要多条链,如果您在 PyMC3.

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

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