为什么我们在MatLab和Python中对偏度和峰度有不同的值?

c9qzyr3d  于 2022-11-15  发布在  Matlab
关注(0)|答案(1)|浏览(209)

以下是MatLab中的偏度和峰度代码:

  1. clc; clear all
  2. % Generate "N" data points
  3. N = 1:1:2000;
  4. % Set sampling frequency
  5. Fs = 1000;
  6. % Set time step value
  7. dt = 1/Fs;
  8. % Frequency of the signal
  9. f = 5;
  10. % Generate time array
  11. t = N*dt;
  12. % Generate sine wave
  13. y = 10 + 5*sin(2*pi*f*t);
  14. % Skewness
  15. y_skew = skewness(y);
  16. % Kurtosis
  17. y_kurt = kurtosis(y);

在MatLab中得到的答案是:
Y_skew=4.4686810415491e-15
Y_kurt=1.500000000000001(在matlab中为正值)
现在,以下是用Python编写的代码:

  1. import numpy as np
  2. from scipy.stats import skew
  3. from scipy.stats import kurtosis
  4. # Generate "N" data points
  5. N = np.linspace(1,2000,2000)
  6. # Set sampling frequency
  7. Fs = 1000
  8. # Set time step value
  9. dt = 1/Fs
  10. # Frequency of the signal
  11. f = 5
  12. # Generate time array
  13. t = N*dt
  14. # Generate sine wave
  15. y = 10 + 5*np.sin(2*np.pi*f*t);
  16. # Skewness
  17. y_skew = skew(y)
  18. # Kurtosis
  19. y_kurt = kurtosis(y)

在Python中得到的答案是:
Y_SKEW=-1.8521564287013977e-16
Y_Kurt=**-**1.5(在Python中,值原来是负数)
谁能解释一下,为什么在MatLab和Python语言中,偏度和峰度有不同的答案?
具体地说,在峰度的情况下,该值已从正值变为负值。有谁能帮我理解一下这一点。

vsaztqbk

vsaztqbk1#

这就是费舍尔和皮尔逊对峰度的衡量标准之间的差异。
MATLAB docs
峰度是衡量分布异常值倾向程度的指标。正态分布的峰度为3。比正态分布更容易出现异常值的分布的峰度大于3;较不容易出现异常值的分布的峰度小于3。峰度的一些定义从计算值中减去3,因此正态分布的峰度为0。kurtosis函数不使用此约定。
scipy docs
峰度是四个中心矩除以方差的平方。如果使用费舍尔定义,则从结果中减去3.0得出正态分布的0.0。
请注意,在Scipy中默认使用Fisher的定义

  1. scipy.stats.kurtosis(a, axis=0, fisher=True, ...)

如果您在Python中使用了fisher=False(或手动添加3),或者从您的matlab结果中减去3,那么您的结果将是相同的,这样它们就使用了相同的定义。
所以看起来标志被翻转了,但这只是偶然的,因为+1.5 - 3 = -1.5
偏斜度的差异似乎是由于数值精度的原因,因为这两个结果基本上都是0。请参阅Why is 24.0000 not equal to 24.0000 in MATLAB?

相关问题