解密EEMD分析:Rlibeemd包带你玩转信号分解和时间序列预测

news2024/11/8 0:52:34

一、简介

1.1 什么是EEMD?

EEMD(Ensemble Empirical Mode Decomposition)是一种信号分解方法,它旨在分解非线性、非平稳或非白噪声的信号,以揭示复杂信号的局部特征和周期性成分。EEMD不同于传统的余弦变换、小波变换等线性变换方法,而是基于经验模态分解(EMD)的思想,通过添加噪声和多次重复分解的方式,避免了EMD中出现的模态混叠等问题。

1.2 EEMD应用?

EEMD在信号处理中具有广泛的应用。它可用于生物医学信号处理,如脑电波信号、心电图信号等;在气象预报中,可以分析天气数据来进行短期和长期气象预测;在金融市场上,EEMD可以用于分析股票市场的长、短期波动特征和走势等。

1.3 怎么实现EEMD?

Rlibeemd是R语言下的一个EEMD算法包,它提供了多种EEMD算法的实现,并支持分解结果可视化。该包的优点在于它提供了多种EEMD算法的选择,标准的EMD算法和修改后的EEMD算法等,可以根据数据特点选择最合适的算法来进行分解。此外,该包还支持直接读取MATLAB中的数据,并能将分解结果输出为MATLAB格式。

二、理论基础

2.1 原始EMD及其局限性

原始EMD(Empirical Mode Decomposition)是一种数据分解方法,它旨在将数据分解为一组本征模态函数(Empirical Mode Function,EMD)和一个残差项。EMD的特点在于它是一种数据驱动的过程,它不依赖于先验的基函数或变换方法,而仅根据输入的数据本身,来构建一组局部自适应的基函数用于分解。

然而,EMD在分解过程中存在一些局限性,例如分解的模态数、分解结果不稳定性等,这对分析数据的准确性和可靠性带来了一定的影响。

2.2 EEMD的基本原理

基于对原始EMD的改进,EEMD(Ensemble Empirical Mode Decomposition)方法在分解过程中引入了噪声数据和多次分解的概念,以保证分解结果的稳定性和准确性。具体来说,EEMD的主要原理是,在原始信号中添加多个不同的高斯白噪声序列,通过多次分解来获得每个本征模态函数,最终把多次分解的模态函数的平均值作为该模态函数的最终结果。

相对于原始EMD,EEMD有以下优势:

  • 减少模态混叠问题,提高分解结果的精度和稳定性;
  • 在不影响结果精确度的情况下,可以通过增加噪声序列来增加分解的次数,进而提高分解结果的可靠性;
  • 可以对多个不同的高斯白噪声序列进行平均,以减少高频部分的噪声对分解结果的影响;
  • 这种方法具有良好的自适应性,可以分解非线性、非平稳或非白噪声序列。

在实际应用中,EEMD已经被广泛应用于时序分析、信号处理、图像处理、金融等领域。

三、EEMD分析的实现

3.1 安装并加载数据集

# 安装Rlibeemd
install.packages("Rlibeemd")

# 加载Rlibeemd包
library(Rlibeemd)

# 加载数据集
data(UKgas)
UKgas

结果展示:

       Qtr1   Qtr2   Qtr3   Qtr4
1960  160.1  129.7   84.8  120.1
1961  160.1  124.9   84.8  116.9
1962  169.7  140.9   89.7  123.3
1963  187.3  144.1   92.9  120.1
1964  176.1  147.3   89.7  123.3
1965  185.7  155.3   99.3  131.3
1966  200.1  161.7  102.5  136.1
1967  204.9  176.1  112.1  140.9
1968  227.3  195.3  115.3  142.5
1969  244.9  214.5  118.5  153.7
1970  244.9  216.1  188.9  142.5
1971  301.0  196.9  136.1  267.3
1972  317.0  230.5  152.1  336.2
1973  371.4  240.1  158.5  355.4
1974  449.9  286.6  179.3  403.4
1975  491.5  321.8  177.7  409.8
1976  593.9  329.8  176.1  483.5
1977  584.3  395.4  187.3  485.1
1978  669.2  421.0  216.1  509.1
1979  827.7  467.5  209.7  542.7
1980  840.5  414.6  217.7  670.8
1981  848.5  437.0  209.7  701.2
1982  925.3  443.4  214.5  683.6
1983  917.3  515.5  224.1  694.8
1984  989.4  477.1  233.7  730.0
1985 1087.0  534.7  281.8  787.6
1986 1163.9  613.1  347.4  782.8

3.2 使用EEMD分解

可通过函数eemd(x, nstd, nee)来实现,其中,x为原始时间序列数据,nstd为加噪的标准差,nee为分解的次数。函数返回一个矩阵,每一列代表一个本征模态函数,最后一列代表残差项。

EEMD分解的步骤如下:

  • 选择合适的噪声类型及标准差,将噪声序列加到原信号中去。
  • 对加噪后的信号进行EMD分解,得到各个本征模态函数。
  • 重复步骤1和2,得到多次分解的结果。
  • 对每个本征模态函数及残差项进行平均,得到最终的分解结果
# 将四个季度数据存储到一个矩阵中
x <- as.matrix(UKgas)
# 进行EEMD分解
imfs <- eemd(x, num_siftings = 10, ensemble_size = 50, threads = 1)


# 将分解结果可视化
par(mfrow = c(2, 2))
colors <- c("steelblue", "firebrick", "springgreen3", "darkorchid3")
for (i in 1:4) {
  plot(imfs[, i], type = "l", main = paste0("IMFs for Qtr", i), col = colors[i])
}

在这里插入图片描述

显示高频和低频分量

par(mfrow = c(2, 1))
ts.plot(rowSums(imfs[,1:3]), main = "High Frequencies",col="red")
ts.plot(rowSums(imfs[, 4:ncol(imfs)]), main = "Low Frequencies",col="blue")

在这里插入图片描述

3.3 分解参数的设置与调整

用法
eemd(
  input,
  num_imfs = 0,
  ensemble_size = 250L,
  noise_strength = 0.2,
  S_number = 4L,
  num_siftings = 50L,
  rng_seed = 0L,
  threads = 0L
)

参数
input	
长度为 N 的向量。要分解的输入信号。

num_imfs	
要计算的固有模式函数 (IMF) 的数量。如果num_imfs设置为零, 将使用 num_imfs = emd_num_imfs(N) 的值,它对应于最大数量 基金组织。请注意,在这方面,最终剩余额也算作国际货币基金组织,因此您最 可能至少需要 num_imfs=2。

ensemble_size	
用作融合的输入信号的副本数。

noise_strength	
用作附加噪声的高斯随机数的标准差。该值相对于输入信号的标准偏差。

S_number	
整数。在给定的 EMD 程序中使用 S 号停止标准 值为 $S$。也就是说,迭代直到信号中的极值和零交叉次数 最多相差一个,S连续迭代保持不变。典型值为 范围 3–8。如果为零,则忽略此停止条件。默认值为 4。S_number

num_siftings	
使用最大筛分次数作为停止标准。如果为零,则忽略此停止条件。默认值为 50。num_siftings

rng_seed	
GSL的Mersenne扭曲随机数生成器的种子。值为零 (默认值)表示实现定义的默认值。

threads	
定义最大并行线程数的非负整数(通过 OpenMP 的 .默认值 0 使用由 OpenMP 定义的所有可用线程。omp_set_num_threadsomp_get_max_threads

EEMD算法中有几个关键的参数需要进行设置,包括分解的模态数目、每个模态的迭代次数、每种模态的随机种子等等。下面列出了一些常用的调参方法。

  • 迭代次数:每个IMF分解的迭代次数,对分解的质量有比较大的影响,一般建议设置在10到400之间,通常会选择一个介于其中的数值,比如说100左右。
  • 模态数目:手动控制分解结果中模态的数量,虽然每个模态是根据一些被一定临界模板判断出来的某些概率门槛,但是我们仍然可以手动增加或减少分解的模态数来适应不同的信号,并尽可能地充分刻画信号的频谱结构。
  • 随机种子:这是决定分解结果的随机性的主要因素之一,通常设置一个不同的随机种子会得到不同的分解结果。为了增加对结果的稳定性,可以考虑进行多次迭代,并将每次迭代的结果进行平均。
  • 交叉验证:与其他机器学习算法一样,交叉验证可以用来评估EEMD算法的性能,并帮助选择最佳的参数。

四、EEMD应用案例

假如我想预测UKgas从1987-2000各季度的使用量,该如何处理呢?

  • 数据预处理和分解
library(stats)
library(tseries)
library(forecast)
library(zoo)

UKgas_ts <- ts(UKgas, start = c(1960, 1), frequency = 4)
start <- 1987
end <- 2000
pred_length <- 4 * (end - start + 1)
  • EEMD分解
# 进行 EEMD 分解
eemdfit <- eemd(UKgas_ts)

# 选择第二个 EIM 模态,作为趋势项
gas_trend <- eemdfit[, "IMF 2"]

# 对 Residual 分解,得到高频噪声项,用于后续预测中叠加
residual_high <- eemd(eemdfit[,"Residual"])[,"IMF 1"]

# 选择第二个 EIM 模态,作为剩余项的趋势
residual_trend <- eemdfit[, "IMF 2"]
residual_notrend_ts <- eemdfit[,"Residual"] - residual_trend
  • 构建ARIMA模型
# 对去趋势后的训练集进行自动 ARIMA 模型拟合
fit <- auto.arima(residual_notrend_ts)

# 构建趋势和剩余项的 ARIMA 模型拟合
gas_trend_fit <- auto.arima(gas_trend)
residual_trend_fit <- auto.arima(residual_trend)



  • 预测
# 预测 1987-2000 年的季度燃气供应量
forecast_result <- forecast(fit, h=pred_length)

# 预测趋势和剩余项
gas_trend_result <- forecast(gas_trend_fit, h=pred_length)
residual_trend_result <- forecast(residual_trend_fit, h=pred_length)
  • 获取最终预测结果
# 将预测结果加上去趋势和剩余项的效应,得到最终预测结果
final_prediction <- forecast_result$mean + gas_trend_result$mean+ residual_trend_result$mean

final_prediction

结果展示:

          Qtr1      Qtr2      Qtr3      Qtr4
1987  796.0600  798.9608  794.7780  792.2792
1988  795.4890  804.0116  816.9882  833.1798
1989  848.6965  859.6348  866.1588  870.9519
1990  875.8916  881.7667  889.5793  899.7981
1991  911.0271  921.3635  930.4858  939.1067
1992  947.2945  954.8810  962.6045  971.3260
1993  980.6850  989.8194  998.7303 1007.8307
1994 1016.8369 1025.2965 1033.5758 1042.2879
1995 1051.2579 1060.0110 1068.7032 1077.7033
1996 1086.7645 1095.4773 1104.0485 1112.8821
1997 1121.8243 1130.5449 1139.2115 1148.1338
1998 1157.1341 1165.9039 1174.5907 1183.4765
1999 1192.4239 1201.1829 1209.8917 1218.7907
2000 1227.7486 1236.5397 1245.2806 1254.1781

五、总结

5.1 Rlibeemd包及其EEMD实现的优势

  • 可定制性:Rlibeemd包提供了较多的参数供用户定制,使用户能够根据具体问题选择各种参数从而达到更好的效果。
  • 鲁棒性:EEMD分析是不确定性的方法,在给定快速傅里叶变换(Fourier transform)的噪音时,它能够保持稳定性。因此,在很多情况下,EEMD能够使得信号处理结果更加稳健。(EEMD是免去了必须精确选择 IMF 微调的方法,具有相对较好的稳定性)
  • 抗噪声:EEMD能够有效地抑制高斯白噪声的影响,提高分析精度。
  • EMD塑形过程的捆绑:传统EMD分析存在塑形过程,一些固有问题是EMD分析本身所固有的,EEMD将必须塑形的过程变为可捆绑的步骤,这则有助于防止污染因子的掺杂。

5.2 EEMD分析在信号处理中的应用前景

  • 音频信号处理:EEMD分析可以用于分析音频信号中的周期信号,并将它们分解为各个固有周期分量,以实现去除周期变化,或更好地理解周期变化等应用。
  • 类脑信号处理:EEMD分析可以应用于类脑信号的处理,如 EEG 信号(脑电波)的分析,将信号分解为恰当的分量,以更好地理解脑电波变化,并由此推断出脑反应或认知功能等信息。
  • 机械信号分析:EEMD分析可以用于机械信号分析,如振动信号的处理,通过将振动信号分解为各个固有频率成分,以实现有效的故障诊断。
  • 地震信号分析:EEMD分析也可以应用于地震信号分析,如地下水位信号分析,通过将信号分解为各个固有频率成分,以更好地理解地震信号的动态演化规律,以实现精准的预判和决策。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/683996.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

按键控制蜂鸣器实验

目录 按键控制蜂鸣器实验 1、简介 2、实验任务 3、程序设计 3.1、顶层模块代码 3.2、按键消抖模块代码 3.3、蜂鸣器控制模块代码 4、仿真验证 5、板上下载验证 5.1、硬件设计 5.2、添加约束文件.xdc 5.3、板上下载验证 按键控制蜂鸣器实验 蜂鸣器&#xff08;Buzze…

微机保护主程序框图原理

微机保护主程序框图如图2&#xff0d;5所示。 一、初始化 “初始化”是指保护装置在上电或按下复位键时首先执行的程序&#xff0c;它主要是对单片微机&#xff08;CPU&#xff09;及可编程扩展芯片的工作方式、参数的设置&#xff0c;以便在后面的程序中按预定方案工作。例如…

荨麻疹【指南共识】

慢性自发性荨麻疹达标治疗专家共识&#xff08;2023&#xff09; 参考文献&#xff1a;中华医学会皮肤性病学分会&#xff0c; 中国医师协会皮肤科医师分会. 慢性自发性荨麻疹达标治疗专家共识&#xff08;2023&#xff09;[J]&#xff0e; 中华皮肤科杂志&#xff0c;2023, e2…

在React+ts中集成高德地图(保姆级教程)

前往高德地图开发平台高德开放平台 | 高德地图API 一&#xff1a;申请高德key 去高德官网去创建一个属于自己的地图应用 &#xff08;得到key和秘钥&#xff09; 。 首先&#xff0c;我们要注册一个开发者账号&#xff0c;根据实际情况填写&#xff0c;身份写个人&#xff1a;…

LwIP系列(3):以太网帧、IP、TCP、UDP、IGMP、ICMP帧格式详解

前言 TCP/IP 本质上是软件协议&#xff0c;而LwIP也是对软件协议进行解析处理&#xff0c;所以我们有必要了解下以太网帧、IP、TCP、UDP、IGMP、ICMP帧格式&#xff0c;这样在代码中&#xff0c;才能有的放矢。 以太网帧框架 以太网帧是最底层的原始数据&#xff0c;帧框架如…

Linux用户密码管理

密码复杂度设置 之前写过一篇文章&#xff0c;通过编辑/etc/pam.d下的配置文件来信hi先密码复杂度设置。 这里介绍另一种方法&#xff0c;使用authconfig名来配置。 如果没有安装该软件&#xff0c;输入如下命令安装: yum install authconfig -y 设置方法如下: authconfi…

力扣动态规划专题(六)编辑距离与回文问题 步骤及C++实现

文章目录 392. 判断子序列动态规划双指针 115.不同的子序列583. 两个字符串的删除操作方法一方法二 72. 编辑距离647. 回文子串动态规划双指针 516.最长回文子序列 392. 判断子序列 动态规划 步骤 确定dp数组以及下标的含义 dp[i][j] 表示以下标i-1为结尾的字符串s&#xff0c…

Json数据 通用提取工具 Web版

问题来源 楼主使用Golang 实现了一款通用型 JSON 数据提取工具&#xff0c;支持自动识别 JSON 数据节点并有序提取为 CSV 文件。 看到大家有这样的评论&#xff0c;顺手实现下&#xff0c;~~ 尴尬的是搞完了 &#xff0c;发现 这个论坛注册不足15天&#xff0c;不能回复评论。晕…

迅为RK3568开发板系统编程手册全新升级

iTOP-3568开发板C应用编程手册全新升级&#xff0c;《iTOP-RK3568开发板系统编程手册》旨在帮助刚入门的用户进行入门规划和学习&#xff0c;为系统编程基础指导手册。 第1部分 系统编程初探 第1章 系统编程初探 1.1 什么是系统编程 1.2 系统编程的作用 1.3 系统调用和C语言库函…

R语言使用xlsx包、安装包的经验以及切换工作目录的方法

R语言使用xlsx包 首先不同于读取txt和csv文件&#xff0c;R语言读取xlsx文件需要安装xlsx包 使用下面命令进行安装xlsx install.packages(“xlsx”) 安装过程非常顺利&#xff0c;需要附带安装其它几个包。如果安装出现错误&#xff0c;可以尝试切换网络&#xff0c;使用手机热…

2-css-1

一 CSS 初体验 CSS 定义&#xff1a;层叠样式表 (Cascading Style Sheets&#xff0c;缩写为 CSS&#xff09;&#xff0c;是一种样式表语言&#xff0c;用来描述HTML文档的呈现&#xff08;美化内容&#xff09; CSS 书写在什么位置&#xff1f; title 标签下方哪个标签里面…

2-css-5

一 定位 1 认识 作用&#xff1a;灵活的改变盒子在网页中的位置 实现&#xff1a; 定位模式&#xff1a;position边偏移&#xff1a;设置盒子的位置 left right top bottom 2 相对定位 position: relative 特点&#xff1a; 不脱标&#xff0c;占用自己原来位置显示模式…

如何将JSON对象转化为java对象,如何将java对象转化为JSON对象

如何将JSON对象转化为java对象&#xff0c;如何将java对象转化为JSON对象 一、在java中如何构建一个JSON对象 在java中我们可以通过创建JsonObject对象的方式来为其添加相应的参数属性&#xff0c;进而构造JSON对象 1、导入JsonObject的依赖 JsonObject是Gson库中的一个类&…

数据结构--数据结构的基本概念

数据结构–数据结构的基本概念 知识总览&#xff1a; 数据结构的三要素 #mermaid-svg-jflLhauniFK26Yxb {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-jflLhauniFK26Yxb .error-icon{fill:#552222;}#mermaid-svg-…

软件测试已经人员饱和了?是否选择退出这个行业?

铺天盖地的职场内卷文章充斥我们眼球&#xff0c;给大家带来山大压力&#xff0c;内心焦虑。据闻&#xff0c;2023年有1070万高校应届毕业生涌入用人市场&#xff0c;其中有多少人将卷入软件测试行业呢&#xff1f;而最近大厂毕业之风盛行&#xff0c;对外输出人才&#xff0c;…

从小白到大神之路之学习运维第46天---第三阶段----Ceph分布式存储系统(CentOS7.9版本下安装部署ceph)

第三阶段基础 时 间&#xff1a;2023年6月25日 参加人&#xff1a;全班人员 内 容&#xff1a; Ceph分布式存储系统 目录 一、Ceph概述 二、Ceph 的工作原理和工作流程 三、Ceph 组件包括 1. RADOS 2. OSD 3. MON 4. MDS 5. RGW 6. RBD 7. CephFS 四、安装部…

文心一言 VS 讯飞星火 VS chatgpt (47)-- 算法导论6.1 5题

五、一个已排好序的数组是一个最小堆吗? 文心一言&#xff1a; 一个已排好序的数组不一定是一个最小堆。最小堆是一种特殊的二叉树&#xff0c;它满足以下性质&#xff1a;对于任意节点 x&#xff0c;其父节点 y 的值都小于等于 x 的值。而一个已排好序的数组只是一个有序数…

【FFmpeg实战】压缩数据AVPacket解析

因为FFmpeg更新的比较快&#xff0c;API也会跟着有所变动&#xff0c;所以声明一下&#xff0c;本文使用的FFmpeg版本为V3.3.5。 1.AVPacket简介 AVPacket是FFmpeg中很重要的一个数据结构&#xff0c;它保存了解复用&#xff08;demuxer)之后&#xff0c;解码&#xff08;dec…

TS格式视频的使用

什么是TS文件格式 TS&#xff08;Transport Stream&#xff0c;传输流&#xff09;是一种封装的格式&#xff0c;它的全称为MPEG2-TS。MPEG2-TS是一种标准数据容器格式&#xff0c;传输与存储音视频、节目与系统信息协议数据&#xff0c;主要应用于数字广播系统&#xff0c;例…

在加密数据时,如何选择合适的算法?

我们将分解两种主要类型的加密 - 对称和非对称 - 然后深入研究 5 种最常用的加密算法列表&#xff0c;以前所未有的方式简化它们 加密经常被指责为政治实体隐藏恐怖活动&#xff0c;是始终成为头条新闻的网络安全话题之一。任何对不同类型的加密有充分了解的人都可能会觉得对这…