我具有其中我應該寫峭度的函數,如descirbed這裏一個家庭作業的問題:爲什麼我的Kurtosis函數不能產生與scipy.stats.kurtosis相同的輸出?
在分母中的θ是標準偏差(方差的平方根)和分子中的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
前兩個函數,mean
和variance
被成功交叉驗證分別numpy.mean
和numpy.var
,。
我試圖交叉驗證kurt
用下面的語句:
>>> kurtosis(testdata) == kurt(testdata)
False
這裏有兩個峯度函數的輸出:
>>> kurtosis(testdata) # scipy.stats
-1.3
>>> kurt(testdata) # my crappy attempt
0.65192024052026476
哪兒我去錯了嗎? scipy.stats.kurtosis
是否比我給出的方程式更有趣?
關於浮點精度,不應該把浮點值(和它們的錯誤)完全一致嗎?另外,感謝您捕捉那個明顯的錯誤!這看起來像我的部分愚蠢的複製/粘貼錯誤=/ – blz
你可以在你的答案發布代碼?我只是在我的'kurt'函數中刪除了對'np.sqrt'的調用,並且調用了'scipy.stats。峯度(testdata,False,False)',但我仍然得到截然不同的結果。我的功能是輸出'1.70000000 ...',當scipy的功能給我'-1.3'。你有什麼?除了刪除平方根函數之外,你還需要修改其他任何東西嗎? – blz
@blz:當然,我已將代碼添加到我的答案中。順便說一句,1.7是正確的。 -1.3是**超額**(又名費舍爾)峯度,所以你不會將scipy的'fisher'論證設置爲'False'。 – NPE