計算機視覺與深度學習 | 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=1n?ai?fi?(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=1K?ck?(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?}min?k??t?[uk?(t)e?jωk?t]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??[ht?1?,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=1K?scalerk?1?(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.pswp.cn/pingmian/81343.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/81343.shtml
英文地址,請注明出處:http://en.pswp.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…