我有一个作业题,我要写一个峰度函数,如下所示:
分母中的θ是标准差(方差的平方根),分子中带横条的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
:
这是两个峰度函数的输出:
>>> kurtosis(testdata) # scipy.stats
-1.3
>>> kurt(testdata) # my crappy attempt
0.65192024052026476
我哪里出错了?是不是scipy.stats.kurtosis
做的事情比我得到的等式中的更奇特?在
默认情况下,^{} :
这两种行为都可以通过
scipy.stats.kurtosis()
的可选参数进行配置。在最后,方法中的
np.sqrt()
调用是不必要的,因为公式中没有平方根。一旦我删除它,你的函数的输出与我从kurtosis(testdata, False, False)
得到的结果相匹配。在你不应该为了完全相等而比较浮点数。即使数学公式是相同的,在如何将它们转换成计算机代码方面的微小差异也会影响计算结果。在
最后,如果您要编写数字代码,我强烈建议您阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic。在
注:这是我使用的函数:
相关问题 更多 >
编程相关推荐