PyMC3中的链条是什么?

时间:2018-04-13 21:14:22

标签: python bayesian markov-chains 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 output

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

>>> trace.nchains
2

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

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

1 个答案:

答案 0 :(得分:7)

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

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

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

multiple chains

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