第100+32步 ChatGPT学习:时间序列EMD分解

news2024/12/26 18:02:02

基于Python 3.9版本演示

一、写在前面

之前我们介绍过时间序列的季节性分解。

最近又学到了好几种骚操作分解,且可以用这些分解优化时间序列预测性能。

首先,我们来学一学经验模态分解(Empirical Mode Decomposition,EMD)。

二、经验模态(EMD)分解

时间序列的经验模态分解(Empirical Mode Decomposition,EMD)是一种数据驱动的信号处理技术,用于分解非线性、非平稳信号。EMD技术由诺贝尔奖获得者黄锷(Norden E. Huang)和他的同事们在1998年提出,它特别适用于分析自然界中复杂的时间序列数据。

EMD的基本思想是将一个复杂的信号分解成若干个具有不同时间尺度的内禀模态函数(Intrinsic Mode Functions,IMFs)和一个残余信号。这些IMFs代表信号中的不同振荡模式,而残余信号则反映了信号的整体趋势。

(1)EMD的优点

1)自适应性:EMD是一种完全自适应的方法,不需要任何预设参数,能够处理非线性、非平稳信号。。

2)直观性:分解得到的IMFs通常具有物理意义,便于理解和解释信号中的不同成分。

3)广泛应用:EMD已在气象学、地震学、生物医学信号处理、机械故障诊断等领域得到了广泛应用。

(2)EMD的缺点

1)边界效应:由于边界处数据不足,包络线构建过程中可能出现误差,影响分解结果。

2)模式混叠:在某些情况下,分解得到的IMFs可能会包含多个不同频率的成分,导致模态混叠问题。

3)计算复杂度:EMD的计算过程较为复杂,尤其是对长时间序列数据,计算时间较长。

三、EMD代码Pyhton实现

下面,我使用的是之前分享过的肺结核的数据做演示:

Python代码:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import CubicSpline

# 读取数据
file_path = 'pone.0277314.s006.xlsx'
data = pd.read_excel(file_path)

# 提取时间和PTB病例数
time_series = data['Time']
ptb_cases = data['PTB cases']

# 将时间转换为数值形式
time_numeric = np.arange(len(time_series))

def get_envelope_mean(signal):
    """计算信号的上包络线和下包络线的均值"""
    maxima = np.where(np.r_[True, signal[1:] > signal[:-1]] & np.r_[signal[:-1] > signal[1:], True])[0]
    minima = np.where(np.r_[True, signal[1:] < signal[:-1]] & np.r_[signal[:-1] < signal[1:], True])[0]
    
    if len(maxima) < 2 or len(minima) < 2:
        return np.zeros_like(signal)
    
    upper_env = CubicSpline(maxima, signal[maxima])(time_numeric)
    lower_env = CubicSpline(minima, signal[minima])(time_numeric)
    
    return (upper_env + lower_env) / 2

def sift(signal, max_iter=1000, tol=1e-6):
    """对信号进行sifting操作,提取IMF"""
    h = signal
    for _ in range(max_iter):
        m = get_envelope_mean(h)
        h1 = h - m
        
        if np.mean(np.abs(h - h1)) < tol:
            break
        h = h1
    
    return h

def emd(signal, max_imfs=10):
    """进行EMD分解"""
    residual = signal
    imfs = []
    for _ in range(max_imfs):
        imf = sift(residual)
        imfs.append(imf)
        residual = residual - imf
        
        if np.all(np.abs(residual) < 1e-6):
            break
    
    return np.array(imfs), residual

# 执行EMD分解
imfs, residual = emd(ptb_cases.values)

# 绘制分解结果
num_imfs = imfs.shape[0]
plt.figure(figsize=(12, 9))
for i in range(num_imfs):
    plt.subplot(num_imfs + 1, 1, i + 1)
    plt.plot(time_series, imfs[i], label=f'IMF {i + 1}')
    plt.legend()

# 绘制剩余信号
plt.subplot(num_imfs + 1, 1, num_imfs + 1)
plt.plot(time_series, residual, label='Residual')
plt.legend()
plt.tight_layout()
plt.show()

输出:

放原图方便对比:

GPT的解读:

输出的图像展示了时间序列数据(PTB病例数)的经验模态分解(EMD)结果,包括内禀模态函数(IMFs)和剩余信号(Residual)。以下是对每个部分的解释:

(1)IMF 1到IMF 7:

1)这些图分别表示分解得到的不同内禀模态函数(IMFs),每个IMF代表了原始信号中的不同频率成分。

2)IMF 1 通常包含最高频率的振荡成分,反映了数据中的快速变化或噪声。

3)IMF 2 至 IMF 7 依次表示频率逐渐降低的振荡成分。IMF 7 通常包含最低频率的成分,反映了数据中的长期趋势或变化。

(2)残余信号(Residual):

1)残余信号表示在所有IMFs提取后剩下的部分,通常反映了数据的长期趋势或整体趋势。

2)在这个图中,Residual接近于零,表明大部分信号成分已经被前面的IMFs提取。

通过EMD分解,我们可以将复杂的时间序列数据分解成不同频率成分的IMFs,并识别出数据中的各种变化模式和趋势。具体的解释如下:

1)高频成分(IMF 1-2):这些成分包含了数据中的快速波动,可能对应于季节性变化、短期扰动或噪声。

2)中频成分(IMF 3-5):这些成分反映了中期变化,如年度周期、经济周期等。

3)低频成分(IMF 6-7):这些成分代表了长期趋势,可能反映了数据的整体上升或下降趋势。

4)残余信号(Residual):如果残余信号接近于零,表示大部分信号已经通过IMFs提取出来。若残余信号非零且变化趋势明显,表示还有未被提取的长期趋势。

通过这种分解,可以更清楚地了解时间序列数据的各个成分,便于进一步的分析和建模。

五、关于结果的疑问

(1)“低频成分(IMF 6-7):这些成分代表了长期趋势。”为什么6和7的趋势都不一样?如何解释?

答曰:

1、IMF 6和IMF 7的不同趋势:

① IMF 6:这条线显示了较低频率的振荡和趋势。它可能代表的是一个中长期的变化,比如几年的周期性波动。这些波动可能是由某些周期性事件或变化引起的,例如政策变动、社会经济变化等。

② IMF 7:这条线显示了最低频率的振荡,通常被视为更长期的趋势。这些趋势可以反映数据的总体上升或下降趋势,可能是由于长期的结构性变化、整体发展趋势或其他长周期因素。

2、为何趋势不同:

① 不同IMF的趋势和频率内容不同,因为每个IMF捕捉信号中的不同振荡成分。虽然IMF 6和IMF 7都是低频成分,但它们对应不同的时间尺度。IMF 6可能捕捉到中期的趋势和波动,而IMF 7更关注长期的变化趋势。

② 这些不同的趋势说明数据中存在多个时间尺度的变化,反映了信号的多层次复杂性。

3、具体解释:

① IMF 6:可能反映了中期的波动,比如政策变动、社会经济变化等,这些变化可能在几年的时间内表现出来。

② IMF 7:可能反映了数据的长期趋势,比如技术进步、人口增长等,导致整体数据的上升或下降。

(2)“中频成分(IMF 3-5):这些成分反映了中期变化”,为什么3、4和5的趋势都不一样?如何解释?

答曰:

1、IMF 3、IMF 4和IMF 5的不同趋势:

IMF 3:这条线显示了较高频率的中期振荡,可能代表的是较短时间尺度上的变化,比如几个月到一年的周期性波动。

IMF 4:这条线显示了中等频率的振荡,可能代表的是中等时间尺度上的变化,比如一到三年的周期性波动。

IMF 5:这条线显示了较低频率的中期振荡,可能代表的是更长时间尺度上的变化,比如三到五年的周期性波动。

2、为何趋势不同:

频率和时间尺度的不同:虽然这些IMF都属于中频成分,但它们对应的频率不同,因此捕捉到的变化也不同。每个IMF反映了原始信号中不同频率范围的振荡成分。

多层次复杂性:信号中存在多个时间尺度的变化,反映了信号的多层次复杂性。IMF 3、IMF 4和IMF 5分别捕捉了不同层次的中期变化。

3、具体解释:

IMF 3:可能反映了较短时间内的波动,比如季节性变化、短期市场波动等。

IMF 4:可能反映了中等时间内的变化,比如年度周期、经济周期等。

IMF 5:可能反映了更长时间内的变化,比如政策变化、社会经济趋势等。

六、最后

那么,做这些分解有什么作用呢?有大佬基于这些分解出来的序列分别作预测,然后再次合并,达到提升预测性能的作用。

下一期,我们来测试一下这种策略的可行性,是否只是一个噱头。

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

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

相关文章

Spring Shell如何与SpringBoot集成并快速创建命令行界面 (CLI) 应用程序

Spring Shell 介绍 Spring Shell 是一个强大的工具&#xff0c;可用于构建命令行应用程序&#xff0c;提供了简单的方式来创建和管理交互式 CLI。它适合那些希望通过命令行与 Java 应用程序进行交互的开发者&#xff0c;尤其是在需要自动化、交互式输入或与 Spring 生态系统集…

后端返回前端的数据量过大解决方案

后端返回前端的数据量过大解决方案 性能面板(Performance) chrome调试指南 原因 遇到一个页面有好几个表格&#xff0c;部分表格采用虚拟滚动条 数据量有点大 接近快60s了&#xff0c;看一下是哪里导致的慢 后台请求方法执行并不慢 2024-12-04 15:21:52.889 INFO 69948 …

linux 系列服务器 高并发下ulimit优化文档

系统输入 ulimit -a 结果如下 解除 Linux 系统的最大进程数 要解除或提高 Linux 系统的最大进程数&#xff0c;可以修改 ulimit 设置和 /etc/security/limits.conf 文件中的限制。 临时修改 ulimit 设置 可以使用 ulimit 命令来查看和修改当前会话的最大进程数&#xff1a; 查…

c++数据结构算法复习基础--11--高级排序算法-快速排序-归并排序-堆排序

高阶排序 1、快速排序 冒泡排序的升级算法 每次选择一个基准数&#xff0c;把小于基准数的放到基准数的左边&#xff0c;把大于基准数的放到基准数的右边&#xff0c;采用 “ 分治算法 ”处理剩余元素&#xff0c;直到整个序列变为有序序列。 最好和平均的复杂度&#xff1a…

洛谷P1827 [USACO3.4] 美国血统 American Heritage(c嘎嘎)

题目链接&#xff1a;P1827 [USACO3.4] 美国血统 American Heritage - 洛谷 | 计算机科学教育新生态 题目难度&#xff1a;普及 首先介绍下二叉树的遍历&#xff1a; 学过数据结构都知道二叉树有三种遍历&#xff1a; 1.前序遍历&#xff1a;根左右 2.中序遍历&#xff1a;左根…

# 全过程 快速创建一个Vue项目

如何快速创建一个Vue项目 前置知识 ​ 下载 Node.js 并且进行安装和配置 Node.js&#xff0c;因为 npm&#xff08;Node Package Manager&#xff09;是随 Node.js 一起安装的。 Node.js 下载地址 : Node.js 官方网站 ​ (如果你还没有关于 Node.js&webpack 的相关知识…

小程序 模版与配置

WXML模版语法 一、数据绑定 1、数据绑定的基本原则 &#xff08;1&#xff09;在data中定义数据 &#xff08;2&#xff09;在WXML中使用数据 2、在data中定义页面的数据 3、Mustache语法的格式&#xff08;双大括号&#xff09; 4、Mustache语法的应用场景 &#xff08;…

智慧银行反欺诈大数据管控平台方案(四)

智慧银行反欺诈大数据管控平台的核心内容&#xff0c;是通过整合多维度、多层次的金融交易信息&#xff0c;利用先进的大数据分析、机器学习与人工智能算法&#xff0c;构建一个系统性、实时性和智能化的反欺诈管控网络&#xff0c;旨在提供全面、高效、精准的风险评估机制。该…

MSSQL2022的一个错误:未在本地计算机上注册“Microsoft.ACE.OLEDB.16.0”提供程序

MSSQL2022导入Excel的一个错误&#xff1a;未在本地计算机上注册“Microsoft.ACE.OLEDB.16.0”提供程序 一、导入情况二、问题发现三、问题解决 最近在安装新版SQLServer SSMS 2022后&#xff0c;每次导入Excel都会出现错误提示&#xff1a;未在本地计算机上注册“Microsoft.AC…

基于极角排序实现二维点的逆时针排列

在二维几何计算中,常常需要对一组点进行逆时针排序,以便用于构建多边形、实现凸包算法或绘制几何图形等。本文将详细介绍一种基于极角计算的方法,使用C++实现将点集按照逆时针顺序排列,并提供完整代码和输出示例,适合直接应用于工程项目或算法学习。 一、问题背景 在一个…

Hbase整合Mapreduce案例2 hbase数据下载至hdfs中——wordcount

目录 整合结构准备数据下载pom.xmlMain.javaReduce.javaMap.java操作 总结 整合结构 和案例1的结构差不多&#xff0c;Hbase移动到开头&#xff0c;后面跟随MR程序。 因此对于输入的K1 V1会进行一定的修改 准备 在HBASE中创建表&#xff0c;并写入数据 create "wunaii…

学习threejs,使用canvas更新纹理

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️Texture 贴图 二、&#x1…

K8s 十年回顾(Ten Year Review of K8s)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。Kubernetes 十年回顾 起源与…

AMR移动机器人赋能制造业仓储自动化升级

在当今制造业的激烈竞争中&#xff0c;智能化、数字化已成为企业转型升级的关键路径。一家制造业巨头&#xff0c;凭借其庞大的生产体系和多个仓库资源&#xff0c;正以前所未有的决心和行动力&#xff0c;在制造业智能化浪潮中勇立潮头&#xff0c;开启了降本增效的新篇章。这…

数据分析(一): 掌握STDF 掌握金钥匙-码农切入半导体的捷径

中国的半导体行业必然崛起&#xff01;看清这个大势&#xff0c;就会有很多机会。 今天&#xff0c;我们一起来了解一下半导体行业的一朵金花&#xff1a;STDF。 实际上这只是一种文件格式&#xff0c;但是当你熟练掌握解析这种文件的时候&#xff0c;你就已经打开在这个基础…

自动化测试之等待方式详解

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 在自动化测试中&#xff0c;等待是一个重要的技术&#xff0c;用于处理页面加载、元素定位、元素状态改变等延迟问题。 等待能够确保在条件满足后再进行后续操…

Solving the Makefile Missing Separator Stop Error in VSCode

1. 打开 Makefile 并转换缩进 步骤 1: 在 VSCode 中打开 Makefile 打开 VSCode。使用文件浏览器或 Ctrl O&#xff08;在 Mac 上是 Cmd O&#xff09;打开你的 Makefile。 步骤 2: 打开命令面板 按 Ctrl Shift P&#xff08;在 Mac 上是 Cmd Shift P&#xff09;&…

HTML CSS JS基础考试题与答案

一、选择题&#xff08;2分/题&#xff09; 1&#xff0e;下面标签中&#xff0c;用来显示段落的标签是&#xff08; d &#xff09;。 A、<h1> B、<br /> C、<img /> D、<p> 2. 网页中的图片文件位于html文件的下一级文件夹img中&#xff0c;…

vulnhub靶场之momentum-2

前言 靶机采用virtual box虚拟机&#xff0c;桥接网卡 攻击采用VMware虚拟机&#xff0c;桥接网卡 靶机&#xff1a;momentum-2 192.168.1.40 攻击&#xff1a;kali 192.168.1.16 主机发现 使用arp-scan -l扫描 信息收集 使用namp扫描 这里的命令对目标进行vulner中的漏…

Hadoop生态圈框架部署(八)- Hadoop高可用(HA)集群部署

文章目录 前言一、部署规划二、Hadoop HA集群部署&#xff08;手动部署&#xff09;1. 下载hadoop2. 上传安装包2. 解压hadoop安装包3. 配置hadoop配置文件3.1 虚拟机hadoop1修改hadoop配置文件3.1.1 修改 hadoop-env.sh 配置文件3.3.2 修改 core-site.xml 配置文件3.3.3 修改 …