为什么我的Kurtosis功能不能产生与scipy.stats.kurtosis相同的输出?

时间:2012-11-26 18:50:16

标签: python numpy statistics scipy

我有一个家庭作业问题,我应该为Kurtosis写一个函数,如下所示:

Kurtosis, where theta is the standard deviation

分母中的theta是标准偏差(方差的平方根),分子中的x-with-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做的事情比我给出的等式更好吗?

1 个答案:

答案 0 :(得分:10)

默认情况下,scipy.stats.kurtosis()

  1. 计算多余的峰度(即从结果中减去3)。
  2. 纠正统计偏差(这影响了一些分母)。
  3. 这两种行为都可以通过scipy.stats.kurtosis()的可选参数进行配置。

    最后,您的方法中的np.sqrt()调用是不必要的,因为公式中没有平方根。删除后,您的函数输出与我从kurtosis(testdata, False, False)得到的结果相符。

      

    我尝试用以下陈述交叉验证kurt

    您不应该将浮点数与完全相等进行比较。即使数学公式相同,它们如何转换成计算机代码的微小差异也会影响计算结果。

    最后,如果您要编写数字代码,我强烈建议您阅读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