基于Python scipy.optimize的极大似然估计(MLE)运行失败如何解决
问题修复方案
核心错误原因
- 未对参数增加合法性约束,优化过程中形状参数Kasi、尺度参数Beta出现负值,触发对数输入为负、负数非整数次幂等非法运算,最终返回nan
- 目标函数公式书写错误,不符合超阈值样本服从的广义帕累托分布(GPD)对数似然表达式
- 未指定支持边界约束的优化求解器
修正后可运行代码
from scipy.optimize import minimize import pandas as pd import numpy as np # 读取本地损失数据 My_DataFrame = pd.read_excel("<FILE_PATH_IN_YOUR_MACHINE>\\Losses.xlsx") loss = My_DataFrame["Loss"].values # 提取超过阈值160的超额损失样本 excess_loss = loss[loss > 160] - 160 def negative_ll(x): k, b = x # 拦截非法参数,避免无效运算 if k <= 1e-8 or b <= 1e-8: return 1e12 # 广义帕累托分布对数似然计算 log_likelihood = np.sum( np.log(1/b) + (-1/k - 1) * np.log(1 + k * excess_loss / b) ) # 最大化对数似然转换为最小化负对数似然 return -log_likelihood # 定义参数边界:Kasi>0,Beta>0 param_bounds = [(1e-8, None), (1e-8, None)] # 选择支持边界约束的L-BFGS-B求解器进行优化 mle_result = minimize( fun=negative_ll, x0=[0.7, 20], bounds=param_bounds, method='L-BFGS-B' ) print(mle_result)
结果说明
代码运行后会输出收敛成功的优化结果,mle_result.x中第一个值为Kasi的最优估计值,第二个值为Beta的最优估计值。
内容的提问来源于stack exchange,提问作者Shayan
相关产品推荐
相关产品推荐

