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 中的链是啥?的主要内容,如果未能解决你的问题,请参考以下文章
Struts2系列:(16)Interceptor组成的链是如何进行调用的