以下是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.4686810415491e-15
Y_kurt=1.500000000000001(在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_SKEW=-1.8521564287013977e-16
Y_Kurt=**-**1.5(在Python中,值原来是负数)
谁能解释一下,为什么在MatLab和Python语言中,偏度和峰度有不同的答案?
具体地说,在峰度的情况下,该值已从正值变为负值。有谁能帮我理解一下这一点。
1条答案
按热度按时间vsaztqbk1#
这就是费舍尔和皮尔逊对峰度的衡量标准之间的差异。
从MATLAB docs:
峰度是衡量分布异常值倾向程度的指标。正态分布的峰度为3。比正态分布更容易出现异常值的分布的峰度大于3;较不容易出现异常值的分布的峰度小于3。峰度的一些定义从计算值中减去3,因此正态分布的峰度为0。
kurtosis
函数不使用此约定。从scipy docs:
峰度是四个中心矩除以方差的平方。如果使用费舍尔定义,则从结果中减去3.0得出正态分布的0.0。
请注意,在Scipy中默认使用Fisher的定义
如果您在Python中使用了
fisher=False
(或手动添加3),或者从您的matlab结果中减去3,那么您的结果将是相同的,这样它们就使用了相同的定义。所以看起来标志被翻转了,但这只是偶然的,因为
+1.5 - 3 = -1.5
。偏斜度的差异似乎是由于数值精度的原因,因为这两个结果基本上都是0。请参阅Why is 24.0000 not equal to 24.0000 in MATLAB?