PyMC中指数采样异常:生成与拟合lambda参数不符问题排查
问题分析与修正
核心错误:指数分布的参数定义混淆
np.random.exponential的参数是尺度参数(scale),对应指数分布的均值1/λ;而pm.Exponential的lam参数是率参数(rate),也就是λ,两者互为倒数关系。你生成数据时传入的
lambda_param=0.25是numpy的尺度参数,对应的真实率参数是1/0.25=4,所以拟合结果的lambda均值接近4是完全正确的——不是程序有bug,是你搞混了两个库对指数分布参数的定义方式。修正后的代码
如果想让生成数据的率参数(即PyMC模型里的lam)为0.25,只需要调整numpy生成数据时的参数为1/lambda_param:import numpy as np import arviz as az import pymc as pm lambda_param = 0.25 random_size = 1000 # numpy用尺度参数=1/率参数,所以这里传入1/lambda_param x = np.random.exponential(1 / lambda_param, random_size) basic_model = pm.Model() with basic_model: _lam_ = pm.HalfNormal("lambda", sigma = 1) Y_obs = pm.Exponential("Y_obs", lam = _lam_, observed = x) start = pm.find_MAP(model = basic_model) idata = pm.sample(1000, start = start) summary = az.summary(idata, round_to = 6) summary运行这段代码后,拟合得到的lambda均值会接近0.25,和你预期一致。
内容的提问来源于stack exchange,提问作者Andrew
相关产品推荐
相关产品推荐

