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)
当我检查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个链。