scipy.stats.gamma.fit()输入含负观测值仍输出拟合结果的原因问询
scipy.stats.gamma.fit() 含非正输入的运行逻辑说明
Gamma分布的理论支撑集为正实数,数学层面只要输入存在非正观测值,对应的对数似然值应为负无穷,负对数似然为正无穷,理论上MLE拟合无法收敛。scipy.stats.gamma.fit() 采用工程化调整处理这类不符合理论要求的输入,具体逻辑如下:
- 拟合默认采用
method="MLE"参数,核心目标是最小化总负对数似然值 - 计算单样本负对数似然时,会先校验观测值是否落在分布支撑集内:对无位移的Gamma分布来说即观测值是否大于0
- 对超出支撑集的观测值,不会直接返回无穷大(会导致优化直接崩溃),而是施加一个固定的大数值有限惩罚项,当前版本惩罚量级约为1e16
- 整个优化过程(默认采用L-BFGS-B算法)会基于所有样本的负对数似然之和(含惩罚项)寻找最优分布参数
看似合理结果的成因
如果你的输入中负值占比偏低,惩罚项的总权重会远低于正值样本的负对数似然贡献,优化过程会优先拟合大多数正值样本的分布特征,最终输出的参数对正值样本的拟合效果会看起来符合预期。如果输入负值占比很高,优化过程会优先调整位移参数(loc)把Gamma分布整体左移,让尽可能多的样本落在移动后的支撑集范围内,此时输出的是带位移的Gamma分布参数,和你预期的标准零位移Gamma分布并不一致。
该设计的核心是为了保证数值计算的稳定性,避免输入不符合理论要求时程序直接报错,输出结果本身已经引入了惩罚项的偏差,使用时需要自行校验输入是否符合分布的支撑集要求。
内容的提问来源于stack exchange,提问作者uoay
相关产品推荐
相关产品推荐

