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

blz*_*blz 4 python statistics numpy scipy

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

峰度,其中θ是标准偏差

分母中的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
Run Code Online (Sandbox Code Playgroud)

前两个函数,meanvariance已成功的交叉验证用numpy.meannumpy.var分别.

我尝试kurt使用以下语句进行交叉验证:

>>> kurtosis(testdata) == kurt(testdata)
False
Run Code Online (Sandbox Code Playgroud)

这是两个峰度函数的输出:

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

>>> kurt(testdata)  # my crappy attempt
0.65192024052026476
Run Code Online (Sandbox Code Playgroud)

我哪里做错了?我scipy.stats.kurtosis做的东西比我给出的等式更好吗?

NPE*_*NPE 10

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

  1. 计算过度峰度(即从结果中减去3).
  2. 纠正统计偏差(这影响了一些分母).

这两种行为都可以通过可选参数进行配置scipy.stats.kurtosis().

最后,np.sqrt()您的方法中的调用是不必要的,因为公式中没有平方根.一旦我删除它,你的功能的输出匹配我得到的kurtosis(testdata, False, False).

我尝试用以下语句交叉验证kurt

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

最后,如果你要编写数字代码,我强烈建议阅读每个计算机科学家应该知道的关于浮点运算的内容.

PS这是我用过的功能:

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
Run Code Online (Sandbox Code Playgroud)