2013-03-18 73 views
1

...幫助和聯機文檔說函數scipy.stats.pareto.fit將變量數據集作爲擬合參數,並且可選地包括b(指數),loc,scale 。 結果來自三元組(指數,祿,比例)python scipy stats pareto fit:它是如何工作的

從同一分佈生成數據應導致找到用於生成數據的參數(例如, (使用Python 3 colsole)

$ python 
Python 3.3.0 (default, Dec 12 2012, 07:43:02) 
[GCC 4.7.2] on linux 
Type "help", "copyright", "credits" or "license" for more information. 
>>> 

(在下面留出蟒控制檯提示代碼行 「>>>」)

dataset=scipy.stats.pareto.rvs(1.5,size=10000) #generating data 
scipy.stats.pareto.fit(dataset) 

然而這導致

(1.0, nan, 0.0) 

(指數1,應該是1.5)和

dataset=scipy.stats.pareto.rvs(1.1,size=10000) #generating data 
scipy.stats.pareto.fit(dataset) 

所導致

(1.0, nan, 0.0) 

(指數1,應1.1)和

dataset=scipy.stats.pareto.rvs(4,loc=2.0,scale=0.4,size=10000) #generating data 
scipy.stats.pareto.fit(dataset) 

(指數應該是4,在上述應該是2,尺度應0.4)在

(1.0, nan, 0.0) 

在調用擬合函數時給出另一個指數

scipy.stats.pareto.fit(dataset,1.4) 

回報總是正是這種指數

(1.3999999999999999, nan, 0.0) 

最明顯的問題是:做我完全誤解了這個擬合函數的目的,是用某種方式不同,或者它只是壞了?

備註:在有人提到像Aaron Clauset的網頁(http://tuvalu.santafe.edu/~aaronc/powerlaws/)上給出的專用函數比scipy.stats方法更可靠並且應該用來代替:這可能是事實,但它們也非常非常非常耗費時間,對於10000點的數據集,在普通PC上花費許多小時(可能是幾天,幾周,幾年)。

編輯:哦:擬合函數的參數不分配,但指數減去1的指數(但是這並不能改變上述問題)

回答

2

擬合方法是一種非常普遍且簡單的方法,它對分佈的非負似然函數(self.nnlf)進行optimize.fmin。在pareto這樣的發行版中,它們的參數可以創建未定義的區域,但一般方法不起作用。

特別是,當隨機變量的值不符合分佈的有效性域時,一般nnlf方法返回「inf」。 「fmin」優化器在這個目標函數中表現不佳,除非您已經非常接近地認爲起始值非常接近最終擬合。

一般來說,.fit方法需要使用約束優化器來進行分佈,這些分佈對pdf的適用範圍有限制。

2

看起來你必須爲loc提供一個猜測和scale

In [78]: import scipy.stats as stats 

In [79]: b, loc, scale = 1.5, 0, 1 

In [80]: data = stats.pareto.rvs(b, size=10000) 

In [81]: stats.pareto.fit(data, 1, loc=0, scale=1) 
Out[81]: (1.5237427002368424, -2.8457847787917788e-05, 1.0000329980475393) 

和猜測已是相當準確的配合才能成功:

In [82]: stats.pareto.fit(data, 1, loc=0, scale=1.01) 
Out[82]: (1.5254113096223709, -0.0015898489208676779, 1.0015943893384001) 

In [83]: stats.pareto.fit(data, 1, loc=0, scale=1.05) 
Out[83]: (1.5234726749064218, 0.00025804526532994751, 0.99974649559141171) 

In [84]: stats.pareto.fit(data, 1, loc=0.05, scale=1.05) 
Out[84]: (1.0, 0.050000000000000003, 1.05) 

希望的C問題的上文會告訴你locscale應該是什麼適當的猜測。最有可能的是,loc=0scale=1