使用 fmin 在 Python 中通过采样数据确定 weibull 参数
Posted
技术标签:
【中文标题】使用 fmin 在 Python 中通过采样数据确定 weibull 参数【英文标题】:Determine weibull parameters through sampled data in Python using fmin 【发布时间】:2021-02-28 11:49:04 【问题描述】:我想使用 fmin 来确定下面提到的 Weibull 函数的参数 a、b 和 c 用于采样数据 x。
x= np.array([1.79, 2.04, 2.42, 2.19, 1.75, 1.59, 1.63, 1.69, 1.6 , 1.68, 1.86,
1.99, 1.88, 1.37, 1.96, 2.71, 2.5 , 1.71, 1.53, 2.65])
def fitweibull(x):
def optfun(theta):
return np.exp(-((x-theta[0])/theta[1])**theta[2])
# initial guesses:
a = 1
b = 1
c = 1
return fmin(optfun, [a,b,c],xtol=0.01,ftol=0.01,disp=0)
fitweibull(x)
它给了我错误:ValueError: setting an array element with a sequence.
第一个问题:我做错了什么?第二个问题:有没有办法通过为a、b、c定义一个更好的起点来提高解的准确性?
我对用于确定 weibull 拟合的内置 scipy 函数不感兴趣,除非它用于验证结果。
【问题讨论】:
不幸的是,我会说像这样安装它的整个想法是错误的。详细的错误消息是由于fmin
需要一个返回单个值的函数。
是的,这将是 a、b 和 c 的单个值(是 theta[0]、theta[1]、theta[2]。例如:gist.github.com/plasmaman/5508278
...你见过-np.log( np.sum( ... ) )
的对数可能性吗?
重点是我想适应自定义函数。不是内置的 scipy。
我的 cmets 的全部意义在于,这与您的错误无关。您放置的链接可最大限度地减少对数似然性。因此,它获取函数的日志并对其求和。这是通过最小化负数来最大化的。因为x
是np.array
你的optfun
返回一个数组。要使fmin
工作,您需要返回一个标量。
【参考方案1】:
感谢您正在寻求自定义函数并避免使用 scipy,但是您提供的自定义函数并不是最好的方法。 我建议您使用库reliability。它使用最大似然估计 (MLE) 来找到解决方案。在上面提供的示例中,您正在寻找适合 3 参数 Weibull 分布。这可以按如下方式可靠地完成:
from reliability.Fitters import Fit_Weibull_3P
import matplotlib.pyplot as plt
x = [1.79, 2.04, 2.42, 2.19, 1.75, 1.59, 1.63, 1.69, 1.6 , 1.68, 1.86, 1.99, 1.88, 1.37, 1.96, 2.71, 2.5 , 1.71, 1.53, 2.65]
Fit_Weibull_3P(failures=x)
plt.show()
结果:
Results from Fit_Weibull_3P (95% CI):
Analysis method: Maximum Likelihood Estimation (MLE)
Failures / Right censored: 20/0 (0% right censored)
Parameter Point Estimate Standard Error Lower CI Upper CI
Alpha 0.660176 0.096205 0.496155 0.87842
Beta 1.61525 0.282976 1.14583 2.277
Gamma 1.33523 0.0596597 1.22327 1.45743
Goodness of fit Value
Log-likelihood -6.52595
AICc 20.5519
BIC 22.0391
AD 0.937743
【讨论】:
以上是关于使用 fmin 在 Python 中通过采样数据确定 weibull 参数的主要内容,如果未能解决你的问题,请参考以下文章
矩阵未对齐错误:Python SciPy fmin_bfgs
在 python 中通过 RS232 到 USB 电缆读取秤数据