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])
我是 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])