我有一个家庭作业问题,我应该为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
前两个函数mean
和variance
分别与numpy.mean
和numpy.var
成功交叉验证。
我尝试使用以下语句交叉验证kurt
:
>>> kurtosis(testdata) == kurt(testdata)
False
这是两个峰度函数的输出:
>>> kurtosis(testdata) # scipy.stats
-1.3
>>> kurt(testdata) # my crappy attempt
0.65192024052026476
我哪里出错了? scipy.stats.kurtosis
做的事情比我给出的等式更好吗?
答案 0 :(得分:10)
默认情况下,scipy.stats.kurtosis()
:
这两种行为都可以通过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