EMD
经验模型分解是以傅里叶变换为基础的线性和稳态频谱分析,该方法根据自身时间尺度进行信号分解,不需要设置基函数,这种特性使得EMD方法可以在理论上适合任何信号的分解。
EMD方法的核心在于经验模式分解,可以使复杂信号分解为有限个本征模函数(intrinsic mode function, IMF
),分解得到的信号包含了原始信号中不同时间尺度的局部特征信号,经验模态分解法可以使得非平稳数据进行平稳化处理,然后进行Hilbert
变换得到时频谱图.
本征模函数
如果瞬时频率有意义,那么函数需要对称,局部均值为零,并且有着相同的过零点和极值点的数目,本征模函数的任何一点的瞬时频率都是有意义的. EMD分解的目的就是为了获得本征模函数,然后对各本征模函数进行希尔伯特变换,得到Hilbert
谱.
Huang给出本征模函数需要满足的条件
- 函数在整个时间范围内,局部极值点和过零点的数量必须相等或者最多相差一个.
- 在任意时刻点,局部最大值的包络和局部最小值的包络平均值为0.
EMD分解
在任意时间点上,数据可能包含多个波动模式,所以需要分解处理
分解的基本假设为:
- 数据至少两个极值,一个极大值和一个极小值
- 数据的局部时域特性是由极值点的时间尺度唯一确定
- 如果数据没有极值点但是存在拐点,可以进行微分求出极值,然后通过积分得到分解结果,
sifting
过程
对于信号 x ( t ) x(t) x(t)的EMD分解步骤如下:
- 找到 x ( t ) x(t) x(t)的所有极值点
- 使用插值方法得到极小值点形成的下包络
emint(t)
以及极大值形成的上包络emax(t)
- 计算均值 m ( t ) = ( e m i n t ( t ) + e m a x ( t ) ) / 2 m(t)=(emint(t)+emax(t))/2 m(t)=(emint(t)+emax(t))/2
- 剥离均值 d ( t ) = x ( t ) − m ( t ) d(t)=x(t)-m(t) d(t)=x(t)−m(t)
- 对残余部分继续使用以上步骤
EMD分解存在的问题
- EMD分解得到的IMF存在模态混合现象
- 末端效应影响分解结果
EEMD(ensembled EMD)
Handrin等人用EMD对白噪声进行分解后对结果进行统计,提出了基于噪声辅助分析改进EMD的方法,根据白噪声的均匀分布的特性,在信号中加入白噪声可以将不同时间尺度的信号自动分离到其相适应的参考尺度上,即EEMD方法.
EEMD原理
如果信号的极值点分布不均与会出现模态混叠,由于白噪声的零均值特性,经过多次均值计算后噪音会相互抵消,集成计算的结果可以看做最终结果.
EEMD的计算步骤如下:
- 将白噪声加入到原始信号中
- 新的信号进行EMD分解
- 重复进行步骤1,2,每次加入新的
White Noise
- 将每次循环得到IMF进行集成平均处理综合结果
收盘价格序列分解:EMD
读取期货收盘价数据进行EMD分解得到分解图像如下
from PyEMD import EMD
import matplotlib.pyplot as plt
def emd_demo():
emd = EMD()
y = closep.values
t = np.arange(len(y))
IMF = emd.emd(y)
n = IMF.shape[0]+1
plt.subplot(n, 1, 1)
plt.plot(t, y)
plt.title('close price')
# plt.xlabel('# of obs')
for i, imf in enumerate(IMF):
plt.subplot(n, 1, i+2)
plt.plot(t, imf, 'g', lw=0.8)
plt.title(f'IMF{i+1}')
plt.xlabel('# of obs')
plt.tight_layout()
plt.show()
收盘价格序列分解:EEMD
def eemd_demo():
eemd = EEMD()
emd = eemd.EMD
emd.extrema_detection='parabol'
y = closep.values
t = np.arange(len(y))
IMF = eemd.eemd(y)
n = IMF.shape[0]+1
plt.figure(figsize=(12, 9))
plt.subplot(n, 1, 1)
plt.plot(t, y)
plt.title('close price')
# plt.xlabel('# of obs')
for i, imf in enumerate(IMF):
plt.subplot(n, 1, i+2)
plt.plot(t, imf, 'g', lw=0.8)
plt.ylabel(f'IMF{i+1}')
# plt.xlabel('# of obs')
plt.locator_params(axis='y', nbins=5) # 设置子图之间的上下间距
plt.tight_layout()
plt.show()
if __name__ == '__main__': # 多线程模块需要设置主线程
eemd_demo()
参考资料
PyEMD docs
EMD方法
Decomposing Signal Using Empirical Mode Decomposition
EMD算法python实现
EMD matlab toolbox
EEMD详解