尝试 MLE 拟合 Weibull 分布时 scipy.optimize.minimize 中的 RuntimeWarning
Posted
技术标签:
【中文标题】尝试 MLE 拟合 Weibull 分布时 scipy.optimize.minimize 中的 RuntimeWarning【英文标题】:RuntimeWarning in scipy.optimize.minimize when trying to MLE fit Weibull distribution 【发布时间】:2022-01-14 19:32:06 【问题描述】:我有以下函数to_minimize
,它应该等于 Weibull 分布的数据集的对数似然,在 d 处从左侧截断。
import numpy as np
from scipy.optimize import minimize
def to_minimize(args, data, d=1):
theta, tau = args
n = len(data)
if tau <= 0 or theta <= 0:
pass
term1 = n * (np.log(tau) - tau * np.log(theta) - (-d / theta) ** tau)
term2 = 0
for x in data:
term2 += (tau - 1) * np.log(x) + (-x / theta) ** tau
return term1 + term2
data = numpy.random.rand(100)
weibull = minimize(lambda args: -to_minimize(args, data),
x0=np.array((1., 1.)), bounds=np.array([(1e-15, 10), (1e-15, 10)]))
据我所知,唯一会导致表单错误的事情
RuntimeWarning: invalid value encountered in double_scalars
如果 tau 或 theta 为 0,则应该是。但这些参数的界限特别高于 0,那么为什么我的优化例程会崩溃?
【问题讨论】:
【参考方案1】:在调用np.seterr(all='raise')
并进行更多调试后,我注意到我的计算出现了错误。指数函数中的-
必须在幂之后应用。否则它会尝试取负数的根,这显然是行不通的。
【讨论】:
以上是关于尝试 MLE 拟合 Weibull 分布时 scipy.optimize.minimize 中的 RuntimeWarning的主要内容,如果未能解决你的问题,请参考以下文章
使用 stats.exponweib.fit 在 python 中拟合 Weibull 分布