为什么MATLAB和Python中的偏度和峰度值不同



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

clc; clear all
% Generate "N" data points
N = 1:1:2000;                   
% Set sampling frequency 
Fs = 1000;          
% Set time step value
dt = 1/Fs;
% Frequency of the signal 
f = 5;
% Generate time array
t = N*dt;
% Generate sine wave
y = 10 + 5*sin(2*pi*f*t);  
% Skewness 
y_skew = skewness(y);
% Kurtosis 
y_kurt = kurtosis(y);

在MATLAB中获得的答案是:

y_skew=4.468686410415491e-15

y_kurt=1.500000000001(MATLAB中的值为正(

下面是Python中的代码:

import numpy as np
from scipy.stats import skew
from scipy.stats import kurtosis
# Generate "N" data points
N = np.linspace(1,2000,2000)
# Set sampling frequency 
Fs = 1000          
# Set time step value
dt = 1/Fs
# Frequency of the signal 
f = 5
# Generate time array
t = N*dt
# Generate sine wave
y = 10 + 5*np.sin(2*np.pi*f*t);
# Skewness 
y_skew = skew(y)                                            
# Kurtosis 
y_kurt = kurtosis(y) 

在Python中获得的答案是:

y_偏斜=-1.8521564287013977-16

y_kurt=-1.5(Python中的值为负数(

有人能解释一下,为什么我们在MATLAB和Python中对偏度和峰度有不同的答案吗?

具体而言,在峰度的情况下,该值已从正变为负。有人能帮我理解一下吗。

这是峰度的Fisher和Pearson度量之间的差异。

来自MATLAB文档:

峰度是一种衡量分布异常倾向的指标。正态分布的峰度为3。比正态分布更容易出现异常值的分布具有大于3的峰度;不太倾向于异常值的分布具有小于3的峰度。峰度的一些定义从计算值中减去3,使得正态分布的峰度为0kurtosis函数不使用此约定

来自scipy文档:

峰度是第四个中心矩除以方差的平方如果使用Fisher定义,则从结果中减去3.0,得到正态分布的0.0。

注意到Fisher的定义在scipy 中默认使用

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

如果您在Python中使用fisher=False(或手动添加3(或从MATLAB结果中减去3,使它们使用相同的定义,则您的结果将是等效的。

所以看起来这个符号被翻转了,但这只是+1.5 - 3 = -1.5以来的偶然。


偏度的差异似乎是由于数值精度,因为两个结果基本上都是0。请参阅MATLAB中的24.0000为什么不等于24.0000?

相关内容

  • 没有找到相关文章

最新更新