为什么峰度函数不能产生与scipy.stats.kurtosis?

2024-05-15 05:22:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个作业题,我要写一个峰度函数,如下所示:

Kurtosis, where theta is the standard deviation

分母中的θ是标准差(方差的平方根),分子中带横条的x是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和{}分别与numpy.mean和{}进行了交叉验证。在

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

^{pr2}$

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

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

>>> kurt(testdata)  # my crappy attempt
0.65192024052026476

我哪里出错了?是不是scipy.stats.kurtosis做的事情比我得到的等式中的更奇特?在


Tags: 函数importlenreturndefstatsnpscipy
1条回答
网友
1楼 · 发布于 2024-05-15 05:22:23

默认情况下,^{}

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

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

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

I attempted to cross-validate kurt with the following statement

你不应该为了完全相等而比较浮点数。即使数学公式是相同的,在如何将它们转换成计算机代码方面的微小差异也会影响计算结果。在

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

相关问题 更多 >

    热门问题