我正在学习用于贝叶斯建模的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个来自后向的样本)。
这些链条是具有相同参数的采样器的不同运行方式,还是有其他意义或目的?
发布于 2018-04-14 21:12:38
链是MCMC的单一运行。因此,如果模型中有6个二维参数,并要求1000个样本,那么每个链将得到6个2x1000数组。
在运行MCMC时,最好使用多个链,因为它们可以帮助诊断问题。例如,Gelman-Rubin diagnostic需要多个链,如果在PyMC3中使用多个链,则会自动运行(使用joblib,如果可能的话尝试使用多个核心)。
作为您可能需要多个链的具体示例,请考虑从多模分布中取样。即使是NUTS采样器也不能访问单链中的两种模式,但是您可以使用多个链来诊断这一点。

注意,PyMC3通常在使用它们时组合它们(例如,使用trace.get_values('my_var')),因为它们都是有效的MCMC示例。这确实导致了一些令人困惑的行为,因为在大多数系统中,要求1000个样本实际上可以得到4000条,默认情况下您会得到4条链。
https://stackoverflow.com/questions/49825216
复制相似问题