2012-11-26 74 views
4

我具有其中我應該寫峭度的函數,如descirbed這裏一個家庭作業的問題:爲什麼我的Kurtosis函數不能產生與scipy.stats.kurtosis相同的輸出?

Kurtosis, where theta is the standard deviation

在分母中的θ是標準偏差(方差的平方根)和分子中的x-the-bar是x的平均值。

我實現的功能如下:

import numpy as np 
from scipy.stats import kurtosis 

testdata = np.array([1, 2, 3, 4, 5]) 

def mean(obs): 
    return (1./len(obs)) * np.sum(obs) 

def variance(obs): 
    return (1./len(obs)) * np.sum((obs - mean(obs)) ** 2) 

def kurt(obs): 
    num = np.sqrt((1./len(obs)) * np.sum((obs - mean(obs)) ** 4)) 
    denom = variance(obs) ** 2 # avoid losing precision with np.sqrt call 
    return num/denom 

前兩個函數,meanvariance被成功交叉驗證分別numpy.meannumpy.var,。

我試圖交叉驗證kurt用下面的語句:

>>> kurtosis(testdata) == kurt(testdata) 
False 

這裏有兩個峯度函數的輸出:

>>> kurtosis(testdata) # scipy.stats 
-1.3 

>>> kurt(testdata) # my crappy attempt 
0.65192024052026476 

哪兒我去錯了嗎? scipy.stats.kurtosis是否比我給出的方程式更有趣?

回答

10

默認情況下,scipy.stats.kurtosis()

  1. 計算過量峯度(即,從結果中減去3)。
  2. 糾正統計偏差(這會影響一些分母)。

這兩種行爲都可以通過可選參數配置到scipy.stats.kurtosis()

最後,您的方法中的np.sqrt()調用是不必要的,因爲公式中沒有平方根。一旦我刪除它,你的函數的輸出匹配我從kurtosis(testdata, False, False)得到的結果。

我試圖交叉驗證庫爾特與下面的語句

的確切平等你不應該比較浮點數。即使數學公式相同,它們如何轉換爲計算機代碼的細微差異也會影響計算結果。

最後,如果您打算寫數字代碼,我強烈建議您閱讀What Every Computer Scientist Should Know About Floating-Point Arithmetic

P.S.這是我用過的函數:

In [51]: def kurt(obs): 
    ....:  num = np.sum((obs - mean(obs)) ** 4)/ len(obs) 
    ....:  denom = variance(obs) ** 2 # avoid losing precision with np.sqrt call 
    ....:  return num/denom 
+0

關於浮點精度,不應該把浮點值(和它們的錯誤)完全一致嗎?另外,感謝您捕捉那個明顯的錯誤!這看起來像我的部分愚蠢的複製/粘貼錯誤=/ – blz

+0

你可以在你的答案發布代碼?我只是在我的'kurt'函數中刪除了對'np.sqrt'的調用,並且調用了'scipy.stats。峯度(testdata,False,False)',但我仍然得到截然不同的結果。我的功能是輸出'1.70000000 ...',當scipy的功能給我'-1.3'。你有什麼?除了刪除平方根函數之外,你還需要修改其他任何東西嗎? – blz

+0

@blz:當然,我已將代碼添加到我的答案中。順便說一句,1.7是正確的。 -1.3是**超額**(又名費舍爾)峯度,所以你不會將scipy的'fisher'論證設置爲'False'。 – NPE

相關問題