PyMC3 sample() 函数不接受 "start" 值来生成跟踪

PyMC3 sample() function does not accept the "start" value to generate a trace

我是 PyMC3 和贝叶斯推理方法的新手。我有一个简单的代码,它试图从使用 t运行cated 指数分布生成的人工数据中推断出某些衰减常数 (=1) 的值:

import numpy as np
from scipy import stats
import matplotlib.pyplot as plt 
import pymc3 as pm
import arviz as az


T = stats.truncexpon(b = 10.)
t = T.rvs(1000)

#Bayesian Inference

with pm.Model() as model: 
    #Define Priors
    lam = pm.Gamma('$\lambda$', alpha=1, beta=1)

    #Define Likelihood
    time = pm.Exponential('time', lam = lam, observed = t)

    #Inference
    trace = pm.sample(20, start = {'lam': 10.}, \
            step=pm.Metropolis(), chains=1, cores=1, \
            progressbar = True)


az.plot_trace(trace)
plt.show()

此代码生成如下跟踪

我真的很困惑为什么采样器不接受起始值 10。上面的跟踪应该从 10 开始。我正在使用 python 3.7 到 运行 代码。

谢谢。

发生的事情很少:

  • 当采样器第一次启动时,它有一个调整阶段;默认情况下,此阶段的样本会被丢弃,但这可以通过 discard_tuned_samples 参数
  • 来控制
  • start 参数字典中的键需要对应给随机变量 ('$\lambda$') 的名称,而不是 Python 变量

结合这两个,可以试试

trace = pm.sample(20, start = {'$\lambda$': 10.},
            step=pm.Metropolis(), chains=1, cores=1,
            discard_tuned_samples=False)

然而,另一个可能的问题是

  • 不能保证在第一次抽取时发出起始值;仅当第一个提案样本被拒绝时,这是偶然的。

修复游戏(设置随机种子),不过,我们可以一窥:

trace = pm.sample(20, start = {'$\lambda$': 10.},
            step=pm.Metropolis(), chains=1, cores=1,
            discard_tuned_samples=False, random_seed=1)

...

trace.get_values(varname='$\lambda$')[:10]

# array([10.        ,  5.42397358,  3.19841997,  1.09383329,  1.09383329,
#         1.09383329,  1.09383329,  1.09383329,  1.09383329,  1.09383329])