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

Python 如何从一系列测量中正确确定Weibull PDF参数?,python,statistics,data-science,reliability,weibull,Python,Statistics,Data Science,Reliability,Weibull,假设我有一系列小时测量值,比如平均风速。开始和结束日期用于限制数据的时间。 根据这些数据,我可以计算各个类别的值的频率。第一类包括0到

假设我有一系列小时测量值,比如平均风速。开始和结束日期用于限制数据的时间。 根据这些数据,我可以计算各个类别的值的频率。第一类包括0到<0.5 km/h之间的所有值。第二个all值介于0.5和<1.5 km/h之间,第三个all值介于1.5和<2.5 km/h之间,依此类推。对所有值进行计数,得出以下总分布:

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
如何根据这些值确定威布尔比例因子和威布尔形状因子(例如,使用python,可靠性(?)

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


有没有人知道我哪里有错误,或者如何以不同的方式解决?可能不是单个值,而是频率?

这可能对您有帮助,也可能对您没有帮助,但下面是如何在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

我不知道您的示例数据是什么,但即使使用装箱数据,这也得到了相当好的近似值。比较(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)

好吧,如果你只有装箱的值,正确的方法是区间删失加加权最大似然法。第二种方法是将加权最大似然法应用于箱子的中点(即忽略宽度),第三种方法是通过发明表示箱子中点的复制数据来近似第二种方法,复制次数与箱子频率成比例。例如,0.5公里/小时64个副本,1.5公里/小时678个副本,2.5公里/小时1330个副本,等等。然后对其应用普通的威布尔拟合。但首先看看您使用的任何库是否已经处理了装箱或审查的数据。谢谢,我已经测试了
scipy
(exponweib.fit)和
可靠性
(fit\u Weibull\u 2P)。所有的样本数据和我得到的形状和比例的函数值似乎都被低估了(形状:2.01,比例:3.68)。因此,我试图找到一个解决方案,通过直方图的箱子来估计参数。使用
exponweib.fit\u loc\u scale(数据,1,1)
对装箱值进行拟合,我得到了其他结果:形状:0.92,比例:6.32。我希望形状的值在1.98左右,比例的值在5.60左右,正如另一个web应用程序所建议的,它是我对测试数据的引用。R的结果似乎合适。谢谢。这些值似乎与我期望的与参考应用程序相关的结果相符。但是,由于我想使用Java通过web界面评估数据,我认为一个小型Python脚本非常合适。@SnoopyBrown我使用ScipyOk的weibull_min获得了非常好的结果,这看起来非常好!最初为什么使用
.25
?作为箱子最小值和最大值之间的中心?是的,我只是取箱子左右两侧的平均值。理想情况下,
weibull\u min.fit
会获取您的实际数据点,但既然箱子很小,我想为什么不呢。谢谢您的解释!这样就得到了预期的结果。