PyMC3中的链条是什么?

gc5*_*gc5 9 python markov-chains bayesian 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)
Run Code Online (Sandbox Code Playgroud)

pymc3输出

当我检查trace(在这种情况下来自后验概率的1000个样本)时,我注意到创建了2个链:

>>> trace.nchains
2
Run Code Online (Sandbox Code Playgroud)

我阅读了关于PyMC3的教程,并查看了API,但我不清楚链表示什么(在这种情况下,我从后面询问了1000个样本,但我得到了2个链,每个链有1000个来自后面的样本).

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

col*_*oll 11

链是MCMC的单次运行。因此,如果模型中有六个2-d参数并要求提供1000个样本,则每个链将获得六个2x1000数组。

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

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

多链

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