如何从一系列测量中正确确定 Weibull PDF 参数?

Posted

技术标签:

【中文标题】如何从一系列测量中正确确定 Weibull PDF 参数?【英文标题】:How can the Weibull PDF parameters be correctly determined from a series of measurements? 【发布时间】:2021-06-04 03:12:27 【问题描述】:

假设我有一系列每小时测量值,例如平均风速。开始和结束日期用于在时间方面限制数据。 根据这些数据,我可以计算各个类别的值的频率。第一类包括 0 到

Category    Amount  Frequency (in %)
0-1 km/h    42      0.64
1-2 km/h    444     6.78
2-3 km/h    871     13.30
3-4 km/h    1130    17.25
4-5 km/h    1119    17.08
5-6 km/h    934     14.26
6-7 km/h    703     10.73
7-8 km/h    490     7.48
8-9 km/h    351     5.36
9-10 km/    219     3.34
10-11km/h   143     2.18
11-12 km/h  52      0.79
12-13 km/h  13      0.20
13-14 km/h  15      0.23
14-15 km/h  6       0.09
15-16 km/h  6       0.09
16-17 km/h  4       0.06
17-18 km/h  3       0.05
18-19 km/h  4       0.06
20-21 km/h  2       0.03

如何根据这些值确定 Weibull 比例因子和 Weibull 形状因子(例如,使用 python,可靠性 (?))?

到目前为止,我只将测量系列中的所有单个值传递给 python 可靠性 (Fit_Weibull_2P),从而确定了这两个参数。但是,确定的参数似乎不正确(曲线稍后绘制不正确)或者我没有将值正确传递给 Fit_Weibull_2P。

有没有人知道我在哪里出错或如何以不同的方式解决它?也许不是个人价值观,而是频率?

【问题讨论】:

好吧,如果您只有分箱值,那么正确的处理方法是所谓的区间删失加上加权最大似然。紧随其后的是仅将加权最大似然应用于箱的中点(即,忽略宽度),第三种方法是通过发明代表箱中点的复制数据来近似第二种方法,复制次数成比例到 bin 频率。例如。 0.5 km/h 64 个副本,1.5 678 个副本,2.5 个 1330 个副本,等等。然后对其应用普通 Weibull 拟合。 但首先看看您使用的任何库是否已经处理分箱或审查数据。 谢谢,我已经测试了scipy (exponweib.fit) 和reliability (Fit_Weibull_2P)。无论是所有样本数据,我都得到了似乎被低估的形状和比例的两个函数值(形状:2.01,比例:3.68)。所以我试图找到一个通过直方图的 bin 来估计参数的解决方案。在分箱值上使用exponweib.fit_loc_scale(data, 1, 1) 我得到其他结果:形状:0.92,比例:6.32。正如我对测试数据的引用的另一个 Web 应用程序所建议的那样,我预计形状的值约为 1.98,比例的值约为 5.60。 R 的结果似乎很合适。 可能很明显,如果你想适应例如来自风电场的估计功率,做重要性加权:最小积分(powercurve *(数据 - Weibull))可能与最小积分(数据 - Weibull)完全不同。 【参考方案1】:

我不知道您的样本数据是什么,但即使使用分箱数据,这也能得到很好的近似值。比较 (1) 不使用 floc=0 与 (2) 指定 floc=0 以强制左边界为 0。

import numpy as np
from scipy.stats import weibull_min

x=np.concatenate((np.repeat(.25,42), np.repeat(1, 444), np.repeat(2, 871), np.repeat(3, 1130),
            np.repeat(4, 1119), np.repeat(5, 934), np.repeat(6, 703),
            np.repeat(7, 490), np.repeat(8, 351), np.repeat(9, 219),
            np.repeat(10, 143), np.repeat(11, 52), np.repeat(12, 13),
            np.repeat(13, 15), np.repeat(14, 6), np.repeat(15, 6),
            np.repeat(16, 4), np.repeat(17, 3), np.repeat(18, 4), [20,20]))

print(weibull_min.fit(x)) #1
(1.8742154858771933, 0.13126151114447493, 4.99670007482597)

print(weibull_min.fit(x, floc=0)) #2
(1.9446899445880135, 0, 5.155845183708194)

【讨论】:

好吧,这看起来相当不错!为什么一开始用.25?作为 bin 的最小值和最大值之间的中心? 是的,我只是取了 bin 左右两侧的平均值。理想情况下,weibull_min.fit 会获取您的实际数据点,但由于垃圾箱很小,我想为什么不呢。 感谢您的解释!这种方式得到了预期的结果。【参考方案2】:

这可能对您有帮助,也可能对您没有帮助,但您可以在 R 中做到这一点。

text="
Category    Amount  'Frequency (in %)'
'0-1 km/h'    42      0.64
'1-2 km/h'    444     6.78
'2-3 km/h'    871     13.30
'3-4 km/h'    1130    17.25
'4-5 km/h'    1119    17.08
'5-6 km/h'    934     14.26
'6-7 km/h'    703     10.73
'7-8 km/h'    490     7.48
'8-9 km/h'    351     5.36
'9-10 km/h'    219     3.34
'10-11km/h'   143     2.18
'11-12 km/h'  52      0.79
'12-13 km/h'  13      0.20
'13-14 km/h'  15      0.23
'14-15 km/h'  6       0.09
'15-16 km/h'  6       0.09
'16-17 km/h'  4       0.06
'17-18 km/h'  3       0.05
'18-19 km/h'  4       0.06
'20-21 km/h'  2       0.03
"
df=read.table(text=text, header=TRUE)
left=c(0)
right=c(.5)
for (i in 2:20) 
  left[i]=i-2+.5
  right[i]=i-1+.5

df1=mutate(df, left=left, right=right)
library(tidyr)
df1=uncount(df1, Amount)
bins=select(df1, left, right)
fitdistcens(bins, "weibull")

Fitting of the distribution ' weibull ' on censored data by maximum likelihood 
Parameters:
      estimate
shape 1.953459
scale 5.152375

【讨论】:

谢谢。这些值似乎符合我期望的参考应用程序的结果。但由于我想使用 Java 通过 Web 界面评估数据,我认为一个小的 Python 脚本会非常合适。 @SnoopyBrown 我使用来自 scipy 的 weibull_min 得到了很好的结果【参考方案3】:

这是 间隔 删失数据的情况。也就是说,数据点并不完全已知,但已知已在某个窗口中发生过。

python 包surpyval,找到here(我是它的作者),是一个很好的方法。

import surpyval as surv

# count vector
n = [42, 444, 871, 1130, 1119, 934, 703, 490, 351, 219, 143, 52, 13, 15, 6, 6, 4, 3, 4, 2]
# interval vector
x = [[l, u] for l, u in zip(range(0, 19), range(1, 20))] + [[20, 21]]

model = surv.Weibull.fit(x=x, n=n)
model
Parametric SurPyval Model
=========================
Distribution        : Weibull
Fitted by           : MLE
Parameters          :
     alpha: 5.726746093800134
      beta: 2.1824674168785507

您的数据似乎也被右截断了。也就是说,您没有高于 21 的观察值。这也可以添加到估计值中。

model = surv.Weibull.fit(x=x, n=n, tr=21)
model
Parametric SurPyval Model
=========================
Distribution        : Weibull
Fitted by           : MLE
Parameters          :
     alpha: 5.726746697131137
      beta: 2.182465361355963

虽然这不会改变答案。

【讨论】:

以上是关于如何从一系列测量中正确确定 Weibull PDF 参数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中正确实现方向数组缩减挑战中的堆栈

如何在 Swift 中正确实现不同视图控制器之间的协议和委托?

如何在lua中正确定义局部变量并将其引用到XML?

如何在 Core Data 中正确保存?

如何在iOS7中正确定位后退按钮

如何在c#中正确实现等待异步[重复]