【问题标题】:Why is my Kurtosis function not producing the same output as scipy.stats.kurtosis?为什么我的峰度函数不产生与 scipy.stats.kurtosis 相同的输出?
【发布时间】:2012-11-14 07:18:38
【问题描述】:

我有一个作业问题,我应该写一个峰度函数,如下所述:

分母中的 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 做的事情是否比我给出的方程式更精彩?

【问题讨论】:

    标签: python numpy statistics scipy


    【解决方案1】:

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

    1. 计算超额峰度(即从结果中减去 3)。
    2. 纠正统计偏差(这会影响某些分母)。

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

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

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

    您不应该比较浮点数的精确相等性。即使数学公式相同,它们转换为计算机代码的方式的微小差异也会影响计算结果。

    最后,如果您要编写数字代码,我强烈建议您阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic

    附:这是我用过的功能:

    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
    

    【讨论】:

    • 关于浮点精度,浮点值(及其误差)不应该完全对应吗?另外,感谢您发现了那个明显的错误!这看起来像是我的一个愚蠢的复制/粘贴错误=/
    • 您可以在答案中发布代码吗?我只是在我的kurt 函数中删除了对np.sqrt 的调用,并调用了scipy.stats.kurtosis(testdata, False, False),但我仍然得到了截然不同的输出。我的功能是输出1.70000000...,而 scipy 的功能是给我-1.3。你得到什么?除了删除平方根函数之外,您是否需要修改其他任何内容?
    • @blz:当然,我已将代码添加到我的答案中。顺便说一句,1.7 是正确的。 -1.3 是 excess(又名 Fisher 的)峰度,因此您没有将 scipy 的 fisher 参数设置为 False
    • 非常感谢!我会尝试将其设置为 kwarg;也许这就是为什么我仍然得到过度峰度。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 2021-08-04
    • 2020-05-30
    • 1970-01-01
    • 2019-02-28
    • 1970-01-01
    • 2022-12-05
    相关资源
    最近更新 更多