以下是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,使得正态分布的峰度为0
kurtosis
函数不使用此约定
来自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?