计算机视觉与深度学习 | Python实现EMD-SSA-VMD-LSTM时间序列预测(完整源码和数据)

EMD-SSA-VMD-LSTM混合模型

  • 一、环境配置与依赖
  • 二、数据生成(示例数据)
  • 三、多级信号分解
    • 1. 经验模态分解(EMD)
    • 2. 奇异谱分析(SSA)
    • 3. 变分模态分解(VMD)
  • 四、数据预处理
    • 1. 归一化处理
    • 2. 数据集构建
  • 五、混合LSTM模型
    • 1. 模型架构
    • 2. 模型训练
  • 六、预测与结果重构
    • 1. 多步预测
    • 2. 结果反归一化
  • 七、性能评估与可视化
    • 1. 评估指标
    • 2. 结果可视化
  • 八、完整数据流说明
  • 九、参数调优建议
  • 十、扩展方向
  • 源码说明

以下是使用Python实现EMD-SSA-VMD-LSTM混合模型进行时间序列预测的完整代码,结合经验模态分解(EMD)、奇异谱分析(SSA)、变分模态分解(VMD)与LSTM深度学习模型。该方案适用于复杂非平稳信号的预测任务,代码包含数据生成、多级分解、模型构建和结果可视化。


一、环境配置与依赖

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from PyEMD import EMD
from vmdpy import VMD
from scipy.linalg import hankel, svd
from sklearn.preprocessing import MinMaxScaler
from sklearn.metrics import mean_absolute_error, mean_squared_error
import torch
import torch.nn as nn
from torch.utils.data import Dataset, DataLoader# 设置随机种子保证可复现性
np.random.seed(42)
torch.manual_seed(42)

二、数据生成(示例数据)

def generate_complex_signal(length=1000):"""生成含多成分的非平稳信号"""t = np.linspace(0, 10, length)# 趋势项trend = 0.02 * t**2 + 0.1 * t# 周期成分seasonal1 = 1.5 * np.sin(2 * np.pi * 0.8 * t)seasonal2 = 0.8 * np.cos(2 * np.pi * 2.5 * t)# 脉冲噪声impulse = np.zeros(length)impulse[np.random.choice(length, 20)] = np.random.uniform(-3, 3, 20)# 高斯噪声noise = 0.3 * np.random.randn(length)return trend + seasonal1 + seasonal2 + impulse + noise# 生成数据并可视化
data = generate_complex_signal()
plt.figure(figsize=(12,4))
plt.plot(data, color='darkblue')
plt.title("Generated Non-stationary Signal")
plt.show()

三、多级信号分解

1. 经验模态分解(EMD)

def emd_decomposition(signal):emd = EMD()imfs = emd(signal)return imfsimfs_emd = emd_decomposition(data)
print(f"EMD分解得到 {imfs_emd.shape[0]} 个IMF分量")

2. 奇异谱分析(SSA)

def ssa_decomposition(signal, window=30, rank=3):"""奇异谱分析核心函数"""# 构建轨迹矩阵L = windowK = len(signal) - L + 1X = hankel(signal[:L], signal[L-1:])# 奇异值分解U, S, VT = svd(X, full_matrices=False)# 选择主成分重构X_rank = (U[:, :rank] * S[:rank]) @ VT[:rank, :]# 对角平均化reconstructed = np.zeros_like(signal)for i in range(len(signal)):X_diag = np.diagonal(X_rank, offset=-(L-1-i))reconstructed[i] = X_diag.mean() if X_diag.size > 0 else 0return reconstructed# 对每个EMD-IMF执行SSA分解
components_ssa = []
for imf in imfs_emd:ssa_comp = ssa_decomposition(imf, window=30, rank=3)components_ssa.append(ssa_comp)

3. 变分模态分解(VMD)

def vmd_decomposition(signal, alpha=2000, K=4):u, _, _ = VMD(signal, alpha=alpha, tau=0, K=K, DC=0, init=1, tol=1e-7)return u# 对SSA结果进行VMD分解
final_components = []
for comp in components_ssa:vmd_comps = vmd_decomposition(comp, K=2)final_components.extend(vmd_comps)# 合并所有分量
all_components = np.vstack(final_components)
print(f"总分解分量数: {all_components.shape[0]}")

四、数据预处理

1. 归一化处理

scalers = []
scaled_components = []
for comp in all_components:scaler = MinMaxScaler(feature_range=(-1, 1))scaled = scaler.fit_transform(comp.reshape(-1, 1)).flatten()scaled_components.append(scaled)scalers.append(scaler)scaled_components = np.array(scaled_components)

2. 数据集构建

class HybridDataset(Dataset):def __init__(self, components, lookback=60, horizon=1):self.components = componentsself.lookback = lookbackself.horizon = horizondef __len__(self):return self.components.shape[1] - self.lookback - self.horizon + 1def __getitem__(self, idx):x = self.components[:, idx:idx+self.lookback].T  # (lookback, n_components)y = self.components[:, idx+self.lookback:idx+self.lookback+self.horizon].Treturn torch.FloatTensor(x), torch.FloatTensor(y)lookback = 60
horizon = 1
dataset = HybridDataset(scaled_components, lookback, horizon)
dataloader = DataLoader(dataset, batch_size=32, shuffle=True)

五、混合LSTM模型

1. 模型架构

class MultiScaleLSTM(nn.Module):def __init__(self, input_size, hidden_size=128, output_size=1):super().__init__()# 特征提取层self.lstm1 = nn.LSTM(input_size, hidden_size, batch_first=True)self.dropout1 = nn.Dropout(0.3)# 时序预测层self.lstm2 = nn.LSTM(hidden_size, hidden_size//2, batch_first=True)self.dropout2 = nn.Dropout(0.2)# 输出层self.fc = nn.Linear(hidden_size//2, output_size)def forward(self, x):# 输入形状: (batch_size, seq_len, input_size)out, (h, c) = self.lstm1(x)out = self.dropout1(out)out, _ = self.lstm2(out)out = self.dropout2(out[:, -1, :])return self.fc(out)

2. 模型训练

model = MultiScaleLSTM(input_size=scaled_components.shape[0])
criterion = nn.MSELoss()
optimizer = torch.optim.AdamW(model.parameters(), lr=0.001, weight_decay=1e-4)# 训练循环
for epoch in range(100):total_loss = 0for x, y in dataloader:optimizer.zero_grad()pred = model(x)loss = criterion(pred, y.squeeze())loss.backward()optimizer.step()total_loss += loss.item()print(f"Epoch {epoch+1}/100 | Loss: {total_loss/len(dataloader):.4f}")

六、预测与结果重构

1. 多步预测

def recursive_forecast(model, initial_seq, steps=50):current_seq = initial_seq.clone()predictions = []for _ in range(steps):with torch.no_grad():pred = model(current_seq.unsqueeze(0))predictions.append(pred.numpy()[0][0])# 更新输入序列current_seq = torch.cat([current_seq[1:], pred.unsqueeze(0)])return np.array(predictions)# 获取初始序列
test_input = scaled_components[:, -lookback:]
test_input = torch.FloatTensor(test_input.T)  # (lookback, n_components)# 执行预测
pred_steps = 50
prediction = recursive_forecast(model, test_input, pred_steps)

2. 结果反归一化

# 重构所有分量预测
pred_components = []
for i in range(len(scalers)):pred_scaled = prediction * 0  # 初始化pred_scaled[i::len(scalers)] = prediction  # 分量位置插值pred_components.append(scalers[i].inverse_transform(pred_scaled.reshape(-1, 1)))# 合成最终结果
final_pred = np.sum(pred_components, axis=0).flatten()# 获取真实值
true_values = data[-pred_steps:]

七、性能评估与可视化

1. 评估指标

mae = mean_absolute_error(true_values, final_pred)
rmse = np.sqrt(mean_squared_error(true_values, final_pred))
print(f"MAE: {mae:.4f}")
print(f"RMSE: {rmse:.4f}")

2. 结果可视化

plt.figure(figsize=(12,6))
plt.plot(true_values, label='True', marker='o', linestyle='--')
plt.plot(final_pred, label='Predicted', marker='x', linewidth=2)
plt.fill_between(range(len(final_pred)), final_pred - 1.96*rmse, final_pred + 1.96*rmse, alpha=0.2, color='orange')
plt.title("EMD-SSA-VMD-LSTM Multi-step Prediction")
plt.legend()
plt.grid(True)
plt.show()

八、完整数据流说明

步骤技术实现数学表达
信号生成合成趋势项+周期项+噪声 x ( t ) = ∑ i = 1 n a i f i ( t ) + ϵ ( t ) x(t) = \sum_{i=1}^{n} a_i f_i(t) + \epsilon(t) x(t)=i=1naifi(t)+ϵ(t)
EMD分解自适应分解非平稳信号 x ( t ) = ∑ k = 1 K c k ( t ) + r ( t ) x(t) = \sum_{k=1}^{K} c_k(t) + r(t) x(t)=k=1Kck(t)+r(t)
SSA分解轨迹矩阵SVD分解 X = U Σ V T \mathbf{X} = \mathbf{U\Sigma V}^T X=UΣVT
VMD分解变分模态优化分解 min ⁡ { u k } , { ω k } ∑ k ∥ ∂ t [ u k ( t ) e − j ω k t ] ∥ 2 2 \min_{\{u_k\},\{\omega_k\}} \sum_k \|\partial_t[u_k(t)e^{-j\omega_k t}]\|_2^2 {uk},{ωk}minkt[uk(t)ejωkt]22
特征融合多分量时序对齐 X stack = [ C 1 T ; C 2 T ; … ; C n T ] \mathbf{X}_{\text{stack}} = [\mathbf{C}_1^T; \mathbf{C}_2^T; \dots; \mathbf{C}_n^T] Xstack=[C1T;C2T;;CnT]
LSTM建模门控机制时序建模 f t = σ ( W f ⋅ [ h t − 1 , x t ] + b f ) f_t = \sigma(W_f \cdot [h_{t-1}, x_t] + b_f) ft=σ(Wf[ht1,xt]+bf)
结果重构逆归一化加权求和 y ^ = ∑ k = 1 K scaler k − 1 ( c ^ k ) \hat{y} = \sum_{k=1}^{K} \text{scaler}_k^{-1}(\hat{c}_k) y^=k=1Kscalerk1(c^k)

九、参数调优建议

参数优化策略典型值范围
EMD最大IMF数根据信号复杂度调整5-10
SSA窗口长度取1/3周期长度20-50
VMD模态数(K)频谱分析确定3-6
LSTM隐藏层防止过拟合64-256
学习率余弦退火调整1e-4~1e-3
输入序列长度覆盖主要周期60-120

十、扩展方向

  1. 自适应分解

    # 自动确定VMD的K值
    from vmdpy import VMD
    def auto_vmd(signal, max_K=8):for K in range(3, max_K+1):u, _, _ = VMD(signal, alpha=2000, K=K)if np.any(np.isnan(u)):return K-1return max_K
    
  2. 概率预测

    # 修改输出层为分位数回归
    self.fc = nn.Linear(hidden_size//2, 3)  # 输出3个分位数
    
  3. 在线学习

    # 增量训练机制
    def online_update(model, new_data):model.train()optimizer.zero_grad()outputs = model(new_data)loss = criterion(outputs, targets)loss.backward()optimizer.step()
    

源码说明

  1. 数据兼容性

    • 支持CSV输入:修改generate_complex_signal()pd.read_csv()
    • 多变量扩展:调整输入维度为(n_features, seq_len)
  2. 性能优化

    • 启用CUDA加速:model.to('cuda')
    • 使用混合精度训练:scaler = torch.cuda.amp.GradScaler()
  3. 工业级部署

    # 模型保存与加载
    torch.save(model.state_dict(), 'multiscale_lstm.pth')
    model.load_state_dict(torch.load('multiscale_lstm.pth'))
    

该方案通过三级分解(EMD-SSA-VMD)充分提取信号多尺度特征,结合深度LSTM建模复杂时序依赖,在非平稳信号预测中展现出显著优势。实际应用时需根据数据特性调整分解参数与模型结构,并通过误差分析持续优化。

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

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

相关文章

vue配置子路由,实现点击左侧菜单,内容区域显示不同的内容

文章目录 一、路由链路二、实现步骤准备二级路由下的.vue文件配置子路由声明router-view标签为菜单项 el-menu-item 设置index属性,设置点击后的路由路径 三、参考资料 一、路由链路 二、实现步骤 准备二级路由下的.vue文件 配置子路由 router/index.js import {…

ModuleNotFoundError: No module named ‘SDToolbox‘

(py311) C:>python Python 3.11.11 | packaged by Anaconda, Inc. | (main, Dec 11 2024, 16:34:19) [MSC v.1929 64 bit (AMD64)] on win32 Type “help”, “copyright”, “credits” or “license” for more information. from SDToolbox import PostShock_eq Tracebac…

Hi3516DV500刷写固件

hi3516DV500刷固件 1、硬件连接 2、软件准备 3、刷固件步骤 一、硬件连接 特别注意的是,串口的接线顺序 通过网线连接好笔记本和开发板后,需要确认一下网口水晶头是否闪烁,以确认网络物理是否连通 二、软件资源准备 固件包准备 打开工具…

正则表达式r前缀使用指南

正则表达式中的 r:解锁字符串转义的魔法 正则表达式是处理字符串的强大工具,但它常常伴随着转义字符的复杂性。如果你曾因 \n、\t 或 \\ 的使用而困惑,那么这篇文章将为你揭开谜底,解释为什么 r 是正则表达式中的「神奇武器」。本…

网络攻防模拟:城市安全 “数字预演”

在当今数字化快速发展的时代,网络安全和城市安全面临着前所未有的挑战。为有效应对这些挑战,利用先进的技术搭建模拟演练平台至关重要。图扑软件的 HT for Web 技术,为网络攻防模拟与城市安全演练提供了全面且高效的解决方案。 三维场景搭建&…

AI模型开发全流程笔记

一、训练数据准备阶段 数据采集标准 格式要求:严格QA对形式(1问1答) 数量基准: 基础量:500组QA对 优化量:800-1000组QA对 内容规范: 聚焦单一业务节点(如售后场景) …

1688 数据接口调用秘籍:高效获取商品实时信息的开发指南

在电商行业竞争白热化的当下,企业想要抢占市场先机,实时掌握商品信息至关重要。作为国内 B2B 电商巨头,1688 平台汇聚海量商品资源,通过高效调用其数据接口获取商品实时信息,能为企业价格策略制定、库存管理、竞品分析…

milvus学习笔记

本文主要由AI生成,请注意自己查看源代码校验。 Milvus v2.4 系统架构概览 Milvus 采用分布式微服务架构,将计算层(Proxy、QueryCoord、QueryNode、IndexCoord、DataCoord、DataNode 等)与存储层(Pulsar、MinIO/S3、e…

使用教程:8x16模拟开关阵列可级联XY脚双向导通自动化接线

以下通过点亮LED进行基本使用流程演示,实际可以连接复杂外设(SPI、CAN、ADC等) 单模块使用 RX、TX、5V和GND接到串口模块;X5接5V;Y2接LED;LED-接GND 串口模块插上电脑后,LED没有亮;因为此时模…

HarmonyOS NEXT~鸿蒙应用上架指南:HarmonyOS应用发布全流程解析

HarmonyOS NEXT~鸿蒙应用上架指南:HarmonyOS应用发布全流程解析 引言 随着华为鸿蒙操作系统(HarmonyOS)生态的快速发展,越来越多的开发者希望将自己的应用上架到鸿蒙应用市场。本文将详细介绍鸿蒙应用上架的全流程,帮助开发者顺…

20250517 我设想一个空间,无限大,空间不与其中物质进行任何作用,甚至这个空间能容纳可以伸缩的空间

1.我设想一个空间,无限大,空间不与其中物质进行任何作用,甚至这个空间能容纳可以伸缩的空间 您设想的这个空间具有一些有趣的特点: 无限大:空间本身没有边界或限制,理论上可以容纳无限多的物质或结构。非…

使用 Kaniko来构建镜像

使用 Kaniko来构建镜像 Kaniko 是一种专注于容器镜像构建的开源工具,其核心设计理念与 Docker 存在显著差异。以下从功能定位、技术实现和适用场景三方面进行对比分析: 一、Kaniko 的核心特性 无需 Docker 守护进程 Kaniko 直接在容器或 Kubernetes 集…

webman用nginx代理静态json文件的异步跨域

场景 有.json文件置于webman的public目录下,使用了nginx做代理,直接访问文件是可以正常加载的,但跨域浏览器就无法加载文件。 nginx配置 文件是否存在于跟目录,存在则设置请求头,不存在则将请求交给webman处理即可。…

JDK 21新特性全面解析

Java Development Kit (JDK) 21作为Oracle长期支持(LTS)版本,于2023年9月正式发布,带来了多项令人振奋的新特性和改进。本文将全面介绍JDK 21中的主要更新,帮助开发者了解如何利用这些新功能提升开发效率和代码质量。 一、虚拟线程(Virtual …

如何选择高性价比的 1T 服务器租用服务​

选择高性价比的 1T 服务器租用服务​,可参考以下内容: 1、根据需求选配置​ 明确自身业务需求是关键。若为小型网站或轻量级应用,数据存储与处理需求不高,选择基础配置服务器即可。如个人博客网站,普通的 Intel Xeon …

JavaScript性能优化实战(11):前沿技术在性能优化中的应用

引言 随着Web应用复杂度和性能需求不断提高,传统的JavaScript优化技术已经无法满足某些高性能计算场景的需求。本文将深入探讨前沿Web技术如何突破JavaScript的性能瓶颈,为Web应用提供接近原生应用的性能体验。从底层计算到图形渲染,从并发处理到动画优化,我们将通过实际案…

package.json 和 package-lock.json 的区别

package.json​​ ​​作用​​ ​​声明项目元数据​​:如项目名称、版本、描述、入口文件等。​​定义依赖范围​​:在 dependencies 和 devDependencies 中声明项目​​直接依赖​​的包及其​​版本范围​​(如 ^1.2.3)。​​…

Rollup入门与进阶:为现代Web应用构建超小的打包文件

我们常常面临Webpack复杂配置或是Babel转译后的冗余代码,结果导致最终的包体积居高不下加载速度也变得异常缓慢,而在众多打包工具中Rollup作为一个轻量且高效的选择,正悄然改变着这一切,本文将带你深入了解这个令人惊艳的打包工具…

基于C#的MQTT通信实战:从EMQX搭建到发布订阅全解析

MQTT(Message Queueing Telemetry Transport) 消息队列遥测传输,在物联网领域应用的很广泛,它是基于Publish/Subscribe模式,具有简单易用,支持QoS,传输效率高的特点。 它被设计用于低带宽,不稳定或高延迟的…

Mysql数据库之集群进阶

一、日志管理 5.7版本自定义路径时的文件需要自己提前创建好文件,不会自动创建,否则启动mysql会报错 错误日志 rpm包(yum) /var/log/mysql.log 默认错误日志 ###查询日志路径 [rootdb01 ~]# mysqladmin -uroot -pEgon123 variables | grep -w log_e…