尝试 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的主要内容,如果未能解决你的问题,请参考以下文章

使用 Scipy 拟合 Weibull 分布

使用 stats.exponweib.fit 在 python 中拟合 Weibull 分布

使用 scipy.stats 将 Weibull 分布拟合到数据是不是表现不佳?

拟合 3 参数 Weibull 分布

将 Weibull 累积分布拟合到 R 中的质量传递数据

使用 R 中的矩法拟合 Weibull