时序分析:曲线分解

news2024/11/18 8:49:10

以下仅为博主个人观点,如有错误欢迎批评指正。
前言后记都挺重要建议还是看一下吧。

文章目录

  • 前言
  • 经验模态分解
    • EMD
    • EEMD
    • CEEMDAN
  • 变分模态分解
    • VMD
  • 奇异谱分析
    • SSA
  • 后记

前言

本篇文章将会介绍常用曲线分解方法(经验模态分解及其变种,变分模态分解,奇异谱分析)。我们使用如下数据。数据下载,提取码8848

import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
data=pd.read_excel("data.xlsx").values[:,1].tolist()
plt.figure(figsize=(16,9));sns.set_style("darkgrid");plt.rcParams['font.family']='SimHei';plt.rcParams['font.sans-serif']=['SimHei']
plt.plot([i+1 for i in range(len(data))],data,linewidth=1)
plt.xticks([1,len(data)],["2011-01-04","2022-12-30"]);plt.xlabel("时间(单位:天)",size=12);plt.ylabel("收盘价(单位:元)",size=12);plt.title("沪深300每天收盘价曲线")
plt.savefig("figure",dpi=500)

在这里插入图片描述
文章侧重代码实践。知识理论给出超链,只要去学一定能懂。

经验模态分解

EMD

参考视频。参考文档。用途:处理非平稳的信号,将原信号分解成为多个不同频率信号以及残差,分解出来的信号被称为本征模态函数以及残差。想法:利用极值点的信息,极值点多频率就高;极值点少频率就低。优点:主观人为参数较少。关键:寻找本征模态函数,去看视频,视频讲解十分好的。分析:金融市场低频信号能够反映某种规律。

import pandas as pd
data=pd.read_excel("data.xlsx").values[:,1].tolist()
import numpy as np
data=np.array(data)
from PyEMD import EMD
emd=EMD()
emd.emd(data)
imfs,residue=emd.get_imfs_and_residue()
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(16,9));sns.set_style("darkgrid");plt.rcParams['font.family']='SimHei';plt.rcParams['font.sans-serif']=['SimHei']
for i in range(imfs.shape[0]):
    plt.subplot(imfs.shape[0]+1,1,i+1);plt.xticks([],[]);plt.ylabel("imf"+str(i+1))
    plt.plot([i+1 for i in range(imfs.shape[1])],imfs[i].tolist())
plt.subplot(imfs.shape[0]+1,1,imfs.shape[0]+1);plt.xticks([1,len(data)],["2011-01-04","2022-12-30"]);plt.ylabel("residue")
plt.plot([i+1 for i in range(residue.shape[0])],residue.tolist())
plt.savefig("figure",dpi=500)

在这里插入图片描述

EEMD

EEMMD是什么??简述一下EEMD的流程:创建n个独立线程,每个线程添加随机噪声进入原有时序曲线从而得到新的时序曲线;对于每个线程所得到的新的时序曲线,用EMD分解;取个平均(每个线程所得分量对应相加再除以n)。为什么这么做??提高了鲁棒性。

import pandas as pd
data=pd.read_excel("data.xlsx").values[:,1].tolist()
import numpy as np
data=np.array(data)
from PyEMD import EEMD
eemd=EEMD()
eemd.eemd(data)
imfs,residue=eemd.get_imfs_and_residue()
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(16,9));sns.set_style("darkgrid");plt.rcParams['font.family']='SimHei';plt.rcParams['font.sans-serif']=['SimHei']
for i in range(imfs.shape[0]):
    plt.subplot(imfs.shape[0]+1,1,i+1);plt.xticks([],[]);plt.ylabel("imf"+str(i+1))
    plt.plot([i+1 for i in range(imfs.shape[1])],imfs[i].tolist())
plt.subplot(imfs.shape[0]+1,1,imfs.shape[0]+1);plt.xticks([1,len(data)],["2011-01-04","2022-12-30"]);plt.ylabel("residue")
plt.plot([i+1 for i in range(residue.shape[0])],residue.tolist())
plt.savefig("figure",dpi=500)

在这里插入图片描述

CEEMDAN

理论大概是EEMD那套,然后有自己的改动。具体是啥没时间看,一般用就用这个吧。

import pandas as pd
data=pd.read_excel("data.xlsx").values[:,1].tolist()
import numpy as np
data=np.array(data)
from PyEMD import CEEMDAN
ceemdan=CEEMDAN()
ceemdan.ceemdan(data)
imfs,residue=ceemdan.get_imfs_and_residue()
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(16,9));sns.set_style("darkgrid");plt.rcParams['font.family']='SimHei';plt.rcParams['font.sans-serif']=['SimHei']
for i in range(imfs.shape[0]):
    plt.subplot(imfs.shape[0]+1,1,i+1);plt.xticks([],[]);plt.ylabel("imf"+str(i+1))
    plt.plot([i+1 for i in range(imfs.shape[1])],imfs[i].tolist())
plt.subplot(imfs.shape[0]+1,1,imfs.shape[0]+1);plt.xticks([1,len(data)],["2011-01-04","2022-12-30"]);plt.ylabel("residue")
plt.plot([i+1 for i in range(residue.shape[0])],residue.tolist())
plt.savefig("figure",dpi=500)

在这里插入图片描述
还有一些其他东西。我在后记之中阐述。

变分模态分解

VMD

参考视频。参考文档。VMD的数学理论很强,没有兴趣没有时间,对它进行深入研究,所以这里跳过理论。VMD具有较好的抗噪能力,可以克服EMD的混叠问题。其他不管,会用就行。这里有些参数,我来讲一下吧。alpha[带宽限制]:经验取值为抽样点长度1.5-2.0倍,tau[噪声容限]:取0就好;K[分量个数]:这个真不好说,跟着感觉走吧。DC:合成信号有常量就取1;合成信号没常量取0,一般取0就好,不管。init:取1就好[均匀分布产生的随机数]。tol[控制误差常量大小]:取1e-7就好,可以更小或者更大。

import pandas as pd
data=pd.read_excel("data.xlsx").values[:,1].tolist()
import numpy as np
data=np.array(data)
from vmdpy import VMD
alpha,tau,K,DC,init,tol=data.shape[0]*1.75,0,10,0,1,1e-7
u,u_hat,omega=VMD(data,alpha,tau,K,DC,init,tol)
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(16,9));sns.set_style("darkgrid");plt.rcParams['font.family']='SimHei';plt.rcParams['font.sans-serif']=['SimHei']
for i in range(u.shape[0]):
    plt.subplot(u.shape[0]+1,1,i+1);plt.xticks([],[]);plt.ylabel("imf"+str(i+1))
    plt.plot([i+1 for i in range(u.shape[1])],u[i].tolist())
plt.savefig("figure",dpi=500)

在这里插入图片描述

奇异谱分析

SSA

流程以及理论部分:我们这里参考知乎。工程部分:通常一般用于解决非线性的时序数据。代码部分:奇异谱分析没有安装包,得自己写,所以流程读者请看代码;这里x是窗口长度[也是分解分量个数]。

def SSA(data,x):
    windowlen=x;datalen=data.shape[0]
    K=datalen-windowlen+1;X=np.zeros((windowlen,K))
    for i in range(K):
        X[:,i]=data[i:i+windowlen]
    U,sigma,VT=np.linalg.svd(X,full_matrices=False)
    for i in range(VT.shape[0]):
        VT[i,:]*=sigma[i]
    A=VT
    REC=np.zeros((windowlen,datalen))
    for i in range(windowlen):
        for j in range(windowlen-1):
            for m in range(j+1):
                REC[i,j]+=A[i,j-m]*U[m,i]
            REC[i,j]/=(j+1)
        for j in range(windowlen-1,datalen-windowlen+1):
            for m in range(windowlen):
                REC[i,j]+=A[i,j-m]*U[m,i]
            REC[i,j]/=windowlen
        for j in range(datalen-windowlen+1,datalen):
            for m in range(j-datalen+windowlen,windowlen):
                REC[i,j]+=A[i,j-m]*U[m,i]
            REC[i,j]/=(datalen-j)
    return REC
import pandas as pd
data=pd.read_excel("data.xlsx").values[:,1].tolist()
import numpy as np
data=np.array(data)
REC=SSA(data,10)
import matplotlib.pyplot as plt
import seaborn as sns
plt.figure(figsize=(16,9));sns.set_style("darkgrid");plt.rcParams['font.family']='SimHei';plt.rcParams['font.sans-serif']=['SimHei']
for i in range(REC.shape[0]):
    plt.subplot(REC.shape[0]+1,1,i+1);plt.xticks([],[]);plt.ylabel("imf"+str(i+1))
    plt.plot([i+1 for i in range(REC.shape[1])],REC[i].tolist())
plt.savefig("figure",dpi=500)

在这里插入图片描述

后记

1).经验模态分解变种不只3个(如:ICEEMDAN),读者下来可以自行进行研究。这里给出两篇文献,博主强烈建议去看。提取码8848。(看了就懂这类套路,其他文章没必要看)(接下我会阐述原因)
2).套路就是:1.选个分解方法进行曲线分解;2.选个预测方法预测分解曲线;3.每个分量的预测值全加起来就是最终的预测值。 以下是某论文流程,其实就是这个套路,其他论文也是一样。我推荐的写得很好,两篇文章都是走量。你能接触各种各样,分解方法预测方法。 其他文章真的水得我都不想再说话了。接下来我教你怎么来水文章(如果你想)。
在这里插入图片描述
3)模板:基于(优化算法-)分解方法-预测方法的某预测。例如:1.基于变分模态分解-误差反向传播神经网络下的上证指数预测。2.基于遗传优化-经验模态分解-循环神经网络下的风速预测。3.Global Tempreture Prediction Based on GA-VMD-LSTM。可产文章数量分析:智能优化数量为A,分解方法数量为B,预测方法数量为C,数据数量更多为D,则可水ABCD篇文章了。 这些文章我真见多,没有必要浪费时间。这些其实都还好吧,我还见过更加艹的。算了我是没有找到,不然高低得把流程图拿出来给各位开眼。大致就是:我比如哈:我使用EMD分解出了10条曲线,对于每条曲线再用VMD来分解(VMD取10吧),一共产生100条曲线,然后每条进行预测。(真小天才,我的评价是不如EMD-VND-EMD-……,时间复杂度一下就上去)
4)我就一本科生,别喷(很多事不成熟)。

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

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

相关文章

集团企业网站建设开发

为集团提供一个互联网上的形象宣传和信息发布、收集的重要平台 利用最新的互联网动态数据库交互能力,建立一套在互联网上具有领先地位的集团网站,将集团和子公司网站做到有机的统一。集团网站不但要把集团的企业、产品等相关信息展示给我们的客户、合作…

RabbitMQ 教程 | 第2章 RabbitMQ 入门

👨🏻‍💻 热爱摄影的程序员 👨🏻‍🎨 喜欢编码的设计师 🧕🏻 擅长设计的剪辑师 🧑🏻‍🏫 一位高冷无情的编码爱好者 大家好,我是 DevO…

1,复杂度和简单排序算法【p2-p3】

复杂度和简单排序算法 1,时间复杂度1.1选择排序1.2冒泡排序1.3异或运算1.3.1性质:1.3.2案例例1例2 1.4插入排序1.5二分法1.5.1在一个有序数组中,找某个数是否存在1.5.2在一个有序数组中,找>某个数最左侧的位置1.5.3局部最小值问…

linux系统编程重点复习--守护进程和线程

复习目标 说出守护进程的特点独立完成守护进程的创建独立实现多个线程的创建独立实现线程的退出和资源回收理解线程同步的思想 1 守护进程 1.1 守护进程介绍 Daemon(精灵)进程,是Linux中的后台服务进程,通常独立于控制终端并且周期性地执行某种任务或…

通向架构师的道路之Apache整合Tomcat

一、先从J2EE工程的通用架构说起 这是一个通用的Web即B/S工程的架构,它由: Web Server App Server DB Server 三大部分组成,其中: Web Server 置于企业防火墙外,这个防火墙,大家可以认为是…

hugging face下载数据集

开始直接执行这个,下载下来的图片打不开 git clone https://huggingface.co/datasets/diffusers/dog-example 解决办法: 安装git lfs 1. curl -s https://packagecloud.io/install/repositories/github/git-lfs/script.deb.sh | sudo bash 2. sudo apt…

论文笔记:Adjusting for Autocorrelated Errors in Neural Networks for Time Series

2021 NIPS 原来的时间序列预测任务是根据预测论文提出用一阶自回归误差预测 一阶差分,类似于ResNet的残差思路?记为pred,最终的预测结果

zore-shot,迁移学习和多模态学习

1.zore-shot 定义:在ZSL中,某一类别在训练样本中未出现,但是我们知道这个类别的特征,然后通过语料知识库,便可以将这个类别识别出来。概括来说,就是已知描述,对未知类别(未在训练集中…

Qsys介绍

文章目录 前言一、为什么需要Qsys1、简化了系统的设计流程2、Qsys涉及的技术 二、Qsys真身1、一种系统集成工具2、何为Nios II1、内核架构2、Nios II选型 三、Qsys设计涉及到的软件&工具四、总结五、参考资料 前言 Qsys是Altera下的一个系统集成工具,可用于搭建…

代码随想录算法训练营第三十天 | 单调栈系列复习

单调栈系列复习 每日温度未看解答自己编写的青春版重点题解的代码日后再次复习重新写 下一个更大元素 I未看解答自己编写的青春版重点题解的代码日后再次复习重新写 下一个更大元素II未看解答自己编写的青春版重点题解的代码日后再次复习重新写 接雨水未看解答自己编写的青春版…

idea模块的pom.xml被划横线,不识别的解决办法

目录 问题: 解决办法: 1.打开设置 2. 取消勾选 3.点击确认 4.解决 问题提出: 写shi山的过程中,给模块取错名字了,改名的时候不知道点到了什么,一个模块的pom.xml变成灰色了&#xff0…

3ds MAX粒子系统演示

其他各案例可以在视频中看到: 从左向右依次是: 粒子流源、喷射、雪、超级喷射、暴风雪、粒子阵列、粒子云 粒子系统

小研究 - JVM 垃圾回收方式性能研究(一)

本文从几种JVM垃圾回收方式及原理出发,研究了在 SPEC jbb2015基准测试中不同垃圾回收方式对于JVM 性能的影响,并通过最终测试数据对比,给出了不同应用场景下如何选择垃圾回收策略的方法。 目录 1 引言 2 垃圾回收算法 2.1 标记清除法 2.2…

iOS开发-实现获取下载主题配置动态切换主题

iOS开发-实现获取下载主题配置动态切换主题 iOS开发-实现获取下载主题配置更切换主题,主要是通过请求服务端配置的主题配置、下载主题、解压保存到本地。通知界面获取对应的图片及颜色等。 比如新年主题风格,常见的背景显示红色氛围图片、tabbar显示新…

Visual Studio 设置默认编码格式为 UTF-8

1.添加高级保存选项 2.更改编码格式

客户端服务器通过Socket API通信流程 通过源码角度分析 三握手四挥手都过程的状态改变 及 例如accept()connect()具体做了什么

首先我们先说下网络编程API: 数据在网络上通信,通信的双方一个是 客户端, 一个是 服务器 更具体来说,不是 客户端和服务器这两个机器在 经由互联网 进行通信, 而是 客户端上的某一进程 与 服务器端的某一进程 进…

Java 单链表

链表基本介绍 链表在内存中的实际存储结构 链表的逻辑结构 单链表应用实例 代码实现 // 英雄节点,存储了英雄的信息 class HeroNode {public int id; // 英雄编号public String name; // 英雄名字public String nickName; // 英雄昵称public HeroNode next; // 指…

【系统软件01】devtoolset离线安装gcc

【系统软件01】devtoolset离线安装gcc 一、SCL简介二、SCL源安装三、离线下载devtoolset1、Developer Toolset2、下载devtoolset-93、压缩devtoolset-9 三、离线安装devtoolset-9(gcc9.3)1、解压devtoolset-9.tar.gz2、安装devtoolset-9 四、设置环境变量(使用gcc9.3)1、当前窗…

LeetCode547.Number-Of-Provinces<省份问题>

题目: 思路: 连通的部分加起来,然后总的 减去连通的部分。 但是很可惜 只能通过部分 似乎将st[i][j] st[j][i] 改变之后是可行的 但是实际上 1 2 连通后 2 1 确实是不会再加。 但是 2 3却还是在加一遍。 好吧。答案的思路是使用并查集。将…

lc209.长度最小的子数组

暴力破解:二次for循环遍历num[i]...num[j],记录满足条件的最小长度 前缀和二分:前缀和降低计算num[i]...num[j]的时间复杂度 对前缀和数组中的每个数进行遍历,找到距离这个数满足条件的最小长度 前缀和数组单调递增,此…