blz*_*blz 4 python statistics numpy scipy
我有一个家庭作业问题,我应该为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
Run Code Online (Sandbox Code Playgroud)
前两个函数,mean并variance已成功的交叉验证用numpy.mean和numpy.var分别.
我尝试kurt使用以下语句进行交叉验证:
>>> kurtosis(testdata) == kurt(testdata)
False
Run Code Online (Sandbox Code Playgroud)
这是两个峰度函数的输出:
>>> kurtosis(testdata) # scipy.stats
-1.3
>>> kurt(testdata) # my crappy attempt
0.65192024052026476
Run Code Online (Sandbox Code Playgroud)
我哪里做错了?我scipy.stats.kurtosis做的东西比我给出的等式更好吗?
NPE*_*NPE 10
默认情况下scipy.stats.kurtosis():
这两种行为都可以通过可选参数进行配置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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2713 次 |
| 最近记录: |