EMD、EEMD、FEEMD、CEEMD、CEEMDAN的区别、原理和Python实现(一)EMD

往期精彩内容:

时序预测:LSTM、ARIMA、Holt-Winters、SARIMA模型的分析与比较

全是干货 | 数据集、学习资料、建模资源分享!

拒绝信息泄露!VMD滚动分解 + Informer-BiLSTM并行预测模型-CSDN博客

风速预测(一)数据集介绍和预处理_风速数据在哪里下载-CSDN博客

风速预测(二)基于Pytorch的EMD-LSTM模型-CSDN博客

风速预测(三)EMD-LSTM-Attention模型-CSDN博客

风速预测(四)基于Pytorch的EMD-Transformer模型-CSDN博客

风速预测(五)基于Pytorch的EMD-CNN-LSTM模型-CSDN博客

风速预测(六)基于Pytorch的EMD-CNN-GRU并行模型-CSDN博客

前言

本文基于前期介绍的风速数据(文末附数据集),进行经验模态分解的介绍与参数选择,最后通过Python实现对风速数据的EMD分解。风速数据集的详细介绍可以参考下文:

风速预测(一)数据集介绍和预处理-CSDN博客

Python 中 EMD包的下载安装:


# 下载
pip install EMD-signal
# 导入
from PyEMD import EMD

切记,很多同学安装失败,不是pip install EMD,也不是pip install PyEMD, 如果 pip list 中 已经有 emd,emd-signal,pyemd包的存在,要先 pip uninstall 移除相关包,然后再进行安装。

1 经验模态分解EMD原理介绍

1.1 EMD概述

经验模态分解(Empirical Mode Decomposition,EMD)方法是一种自适应信号时频处理方法,特别适用于非线性、非平稳信号的分析处理[1]。其本质是一种对信号进行分解的方法,将信号分解为各个相互独立的成分的叠加,依据数据自身的时间尺度特征来进行信号分解,具备自适应性。EMD的优点在于它是一种自适应的、数据驱动的分解方法,不需要预先假设信号的分布或结构。这使得它适用于处理各种类型的信号,包括非线性和非平稳信号。

EMD 认为任何一个复杂序列都是由多个单频率信号叠加而成,因此可以分解成若干个 本征模态函数(Intrinsic Mode Functions, IMF),IMF 的各个分量即代表了原始信号中的各频 率分量,并按照从高频到低频的顺序依次排列,这也是 IMF 的物理含义[2]。

1.2 本征模态函数IMF

本征模态函数(Intrinsic Mode Functions, IMF)就是原始信号被 EMD 分解之后得到的各层信号分量。任何信号都可以拆分成若干个 IMF 之和。IMF 有两个假设条件:

  • 在整个数据段内,极值点的个数和过零点的个数必须相等或相差最多不能超过一 个;

  • 在任意时刻,由局部极大值点形成的上包络线和由局部极小值点形成的下包络线 的平均值为零,即上、下包络线相对于时间轴局部对称。

对于上述的条件理解如下:

第一,图线要反复跨越 x 轴,比如:

反复跨越 x 轴

而不能像下面这样某次穿过零点后出现多个极点:

某次穿过零点后出现多个极点

第二,上下包络线要对称,比如:

上下包络线对称

而不能像如下这样,上下包络线不对称

1.3 EMD 分解的基本假设

  • 信号至少有两个极值点:一个极大值点和一个极小值点;

  • 特征时间尺度由极值之间的时间间隔定义;

  • 如果数据完全没有极值,但只包含拐点,那么可以一次或多次划分来揭示极值点,最终的结果可以通过积分得到

2 EMD分解的基本原理和步骤

EMD的分解过程是一个迭代的过程。首先,对原始信号进行极值点的提取,然后通过连接极值点的均值得到第一轮的近似IMF(也叫做“本征模态1”)。接下来,将这个近似IMF从原始信号中减去,得到一个新的信号,然后对这个新信号再次进行极值点提取和均值连接,得到第二轮的近似IMF。如此往复,直到得到的近似IMF满足某种停止准则。

对于原始信号 X(t)

第一步,极值点提取:

从待分解的信号中识别局部极值点,包括局部极大值和局部极小值。极值点是信号中的局部特征,能够帮助刻画信号的振荡特性。

第二步,构建上下包络线:

通过连接相邻的局部极大值和局部极小值,构建信号的上包络线和下包络线。上包络线 U(t) 由局部极大值连接而成,下包络线 L(t) 由局部极小值连接而成。包络线用于描述信号的振荡范围。

第三步,提取均值函数:

计算上包络线和下包络线的平均值,得到均值函数 m1。将原始信号减去均值函数,得到一维信号 h1。

m1 = ( U(t) + L(t) ) / 2

h1 = X(t) - m1

第四步,迭代分解:

对减去均值函数后的一维信号 h1,重复步骤1-3的过程,直到得到的剩余信号为“单调信号”,或者满足IMF的两个假设条件。迭代k次的IMF为

hk = h(k-1) - mk

第五步,确定本征模态函数(IMF):

在每一次迭代中,通过极值点提取、构建包络线等步骤,得到的剩余信号被称为一个本征模态函数(IMF)。IMF具有局部特征,并且代表了信号在不同尺度上的振荡模式。使用上述方法得到的第一个IMF记为c1, 然后将c1从原始信号中分离,得到

r1 = X(t) - c1

由于r1仍然包含大量信息,因此将r1作为新的原始信号,再通过步骤1-4的分析,可以得到IMF2,以此类推,得到

r1 - c2 = r2,... ..., r(n-1) -cn = rn

当cn或rn小于某一设定值,或者得到的剩余信号为“单调信号”,无法提取更多的IMF时,迭代终止,得到最终的分解结果为:

第六步,重构信号:

将得到的IMF函数进行逐个提取,直到无法再得到新的IMF为止。最终得到的IMF函数可以被看作是信号在不同时间尺度上的振荡模式,它们的组合可以重构原始信号。

这些基本步骤构成了EMD方法的核心流程,通过这些步骤,EMD可以将复杂的信号分解成不同尺度和频率的本征模态函数,从而揭示信号的局部特征和振荡模式。

3 基于Python的EMD实现

3.1 导入数据


import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
matplotlib.rc("font", family='Microsoft YaHei')
# 读取已处理的 CSV 文件
df = pd.read_csv('wind_speed.csv' )
# 取风速数据
winddata = df['Wind Speed (km/h)'].tolist()
winddata = np.array(winddata) # 转换为numpy
# 可视化
plt.figure(figsize=(15,5), dpi=100)
plt.grid(True)
plt.plot(winddata, color='green')
plt.show()

3.2 EMD分解


from PyEMD import EMD

# 创建 EMD 对象
emd = EMD()
# 对信号进行经验模态分解
IMFs = emd(winddata)

# 可视化
plt.figure(figsize=(20,15))
plt.subplot(len(IMFs)+1, 1, 1)
plt.plot(winddata, 'r')
plt.title("原始信号")

for num, imf in enumerate(IMFs):
    plt.subplot(len(IMFs)+1, 1, num+2)
    plt.plot(imf, color='orange')
    plt.title("IMF "+str(num+1), fontsize=10)
# 增加第一排图和第二排图之间的垂直间距
plt.subplots_adjust(hspace=0.8, wspace=0.2)
plt.show()

3.3 信号分量的重构


# 分量重构
reconstructed_data = np.sum(IMFs, 0) # 沿y轴方向求和

plt.figure(figsize=(15,10))
plt.plot(winddata, linewidth=1, color='green', label='PM2.5')
plt.plot(reconstructed_data, linewidth=1, color='orange', label='分解重构结果')
plt.title("EMD 分解重构结果", fontsize=10, loc='center')
plt.xticks(fontsize=10) # x 轴刻度字体大小
plt.yticks(fontsize=10) # y 轴刻度字体大小
plt.legend(loc='upper right') # 绘制曲线图例,信息来自类型 label
plt.show()

3.4 信号分量的处理

通过经验模态分解(EMD)得到了信号的分量,可以进行许多不同的分析和处理操作,以下是一些常见的对分量的利用方向:

(1)信号重构:将分解得到的各个本征模态函数(IMF)相加,可以重构原始信号。这可以用于验证分解的效果,或者用于信号的重建和恢复。

(2)去噪:对于复杂的信号,可能存在噪声或干扰成分。通过分析各个IMF的频率和振幅,可以识别和去除信号中的噪声成分。

(3)频率分析:分析每个IMF的频率成分,可以帮助理解信号在不同频率上的振荡特性,从而揭示信号的频域特征。

(4)特征提取:每个IMF代表了信号的局部特征和振荡模式,可以用于提取信号的特征,并进一步应用于机器学习或模式识别任务中。

(5)信号预测:通过对分解得到的各个IMF进行分析,可以探索信号的未来趋势和发展模式,从而用于信号的预测和预测建模。

(6)模式识别:分析每个IMF的时域和频域特征,可以帮助对信号进行模式识别和分类,用于识别信号中的不同模式和特征。

(7)异常检测:通过分析每个IMF的振幅和频率特征,可以用于探测信号中的异常或突发事件,从而用于异常检测和故障诊断。

在得到了信号的分量之后,可以根据具体的应用需求选择合适的分析和处理方法,以实现对信号的深入理解、特征提取和应用。

3.5 EMD优缺点

优点:

  • 自适应性:EMD 不需要先验知识,是一种自适应的信号分解方法。它可以适应信号的局部特性,对于非线性和非平稳信号的处理效果较好。

  • 基于数据本身:EMD 是一种基于数据的方法,不需要事先对信号进行模型假设。这使得它更适用于各种类型的信号,尤其是那些难以用传统模型描述的信号。

  • 局部特征提取:EMD 可以有效地提取信号的局部特征,使得分解后的 IMFs 更容易理解和分析。每个 IMF 可以被视为信号的一种固有振动模式。

缺点:

  • 模态重叠:在某些情况下,EMD 可能产生模态重叠,即两个或多个 IMFs 在频域上有重叠。这可能导致分解结果的物理意义不清晰。

  • 端效应:EMD 受到信号端点效应的影响,特别是在信号边缘处。这可能导致在信号的边缘附近生成不稳定的模态。

  • 计算复杂度:EMD 的计算复杂度相对较高,尤其是对于长时间序列或高维数据。这可能导致对计算资源的较大需求。

  • 确定性结果:EMD 的结果在一定程度上取决于初始点的选择,这使得结果不是完全确定性的。不同的初始点可能导致不同的分解结果。

参考文献

[1] Huang NE, Shen Z, Long SR, et al. The empirical mode decomposition and the Hilbert spectrum for nonlinear and non-stationary time series analysis. The Royal Society,  1998,454:903-995.

[2]《非平稳数据分解理论  从入门到实践》.蒋锋,杨华.中国财政经济出版社.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值