2014-11-09 33 views
4

我有这样的代码使用自己的代码来计算峰度(http://mathworld.wolfram.com/Kurtosis.html),我把它比作scipy.stats.kurtosisscipy是如何计算峰度的?

a = array([ 1. , 2. , 2.5, 400. , 6. , 0. ]) 
#kurtosis (gives: 4.19886) 
print (sum((a - np.mean(a)) ** 4)/len(a))/np.std(a)**4 
# scipy kurtosis (gives: 5.996677) 
print scipy.stats.kurtosis(a,bias=False) 

为什么SciPy的给不同的结果?我遵循数学世界的定义。

回答

8

如果你读SciPy的的峰度函数的documentation,SciPy的是calculting默认超额峰度(与减3):

scipy.stats.kurtosis(A,轴= 0,渔民=真, bias = True)

计算数据集的峰度(Fisher或Pearson)。

峰度是第四中心时刻除以 方差的平方。如果使用费希尔定义,则从 中减去3.0,得到正态分布的0.0。

如果偏差为假,则峭度用k统计 消除偏见来自偏置时刻来临计算估计器

设置fisherFalse会给你你所期望的:

In [1]: a = np.array([ 1. , 2. , 2.5, 400. , 6. , 0. ]) 

In [2]: scipy.stats.kurtosis(a, fisher=False) 
Out[2]: 4.198860780044809 
+0

非常违反直觉 - 为什么不'scipy.stats.kurtosis(a,fisher = False,bias = False)''给出与我的代码相同的答案?我的代码没有偏差修正 – user248237dfsf 2014-11-09 01:38:47

+3

显然,对'bias'参数的解释很混乱。设置'bias = False'会做偏差修正,而不是相反。 – mtrbean 2014-11-09 01:42:48