4

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

峰度,其中 theta 是标准差

分母中的 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

前两个函数mean和分别成功地与和variance交叉验证。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做的事情比我给定的方程式更精彩吗?

4

1 回答 1

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
于 2012-11-26T18:56:08.587 回答