2016-01-20 76 views
3

我正在尋找使用Python 3.4爲一組數據找到最合適的weibull參數。如何使用python將威布爾分佈適配到數據?

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。)任何幫助表示讚賞。謝謝。

回答

5

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)