我正在学习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个来自后面的样本)。
采样器的链条是否具有相同参数的不同运行,或者它们是否具有其他含义/目的?
答案 0 :(得分:7)
链是MCMC的单次运行。因此,如果模型中有六个2-d参数并要求1000个样本,那么每个链将获得6个2x1000阵列。
运行MCMC时,最好使用多个链,因为它们可以帮助诊断问题。例如,Gelman-Rubin diagnostic需要多个链,并且如果您在joblib
中使用多个链,则会自动运行(使用PyMC3
,尝试使用多个核心)。
作为您可能需要多个链的具体示例,请考虑从多模式分布中进行采样。即使NUTS
采样器可能不会访问单个链中的两种模式,但您可以使用多个链来诊断它。
请注意PyMC3
通常在使用链时组合链(例如,使用trace.get_values('my_var')
),因为它们都是有效的MCMC样本。这确实会导致一些令人困惑的行为,因为在大多数系统上要求1000个样本实际上可以获得4000个,默认情况下你会获得4个链。