如何使用python将Weibull分布拟合到数据中



我希望使用 Python 3.4 为一组数据找到最合适的 weibull 参数。

import scipy.stats as ss
list1 = []
list2 = []
for x in range(0, 10):
    list1.append(ss.exponweib.pdf(x, a=1, c=2.09, scale=10.895, loc=0))
    list2.append(ss.weibull_min.pdf(x, c=2.09, loc=0, scale=10.895))
    if list1[x]-list2[x] < .000000001:
        list1[x]=list2[x]
if list1 == list2:
    print("true")
print(ss.distributions.weibull_min.fit(list1, floc=0))
print(ss.distributions.weibull_min.fit(list1, loc=0))
print(ss.distributions.weibull_min.fit(list1, floc=0))
print(ss.distributions.exponweib.fit(list1, 1,1))
print(ss.distributions.exponweib.fit(list1, floc=0, f0=1))
print(ss.distributions.exponweib.fit(list1, floc=0, a=1, f0=1))

尝试过的所有方法都没有产生输入参数,我无法弄清楚原因。

此代码的输出为:

true
(2.8971366871403661, 0, 0.065615284314998634)
(0.71134622938358294, 0.014105558832066645, 0.076662586739229072)
(2.8971366871403661, 0, 0.065615284314998634)
(0.27753056922336583, 3.1962672780921197, -3.4788071110631162e-27, 0.077986010645321888)
(1, 2.8971366871403661, 0, 0.065615284314998634)
(1, 2.8971366871403661, 0, 0.065615284314998634)

这些都不是正确的输入参数。(2.09 和 10.895。任何帮助,不胜感激。谢谢。

fit()方法的第一个参数是分布中要拟合的值样本(不是 PDF 值)。 因此,您应该使用 rvs() 方法来生成数据,而不是 pdf() 方法。

下面是一个简单的示例,其中我从exponweib分布中生成了 250 个值的样本,然后对该样本使用 fit()。 我假设当我拟合数据时,我知道形状参数a必须是 1,loc参数必须是 0:

In [178]: from scipy.stats import exponweib
In [179]: sample = exponweib.rvs(a=1, c=2.09, scale=10.895, loc=0, size=250)
In [180]: exponweib.fit(sample, floc=0, fa=1)
Out[180]: (1, 2.0822583185068915, 0, 10.946962241403902)

最新更新