PyMC3 中的链是啥?

Posted

技术标签:

【中文标题】PyMC3 中的链是啥?【英文标题】:What is a chain in PyMC3?PyMC3 中的链是什么? 【发布时间】:2018-09-24 07:10:09 【问题描述】:

我正在学习用于贝叶斯建模的 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 个来自后部的样本)。

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

【问题讨论】:

【参考方案1】:

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

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

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

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

【讨论】:

以上是关于PyMC3 中的链是啥?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 PyMC3 中的狄利克雷过程中提取无监督集群?

区块链是啥,怎么用区块链赚钱?

Struts2系列:(16)Interceptor组成的链是如何进行调用的

PyMC3 贝叶斯线性回归预测与 sklearn.datasets

android 编程最原始的工具链是啥?

区块链是啥