基於WOA最佳化的CNN-GRU-Attention的時間序列迴歸預測matlab模擬

简简单单做算法發表於2024-05-05

1.演算法執行效果圖預覽

woa最佳化前

woa最佳化後

2.演算法執行軟體版本

matlab2022a

3.演算法理論概述

時間序列迴歸預測是資料分析的重要領域,旨在根據歷史資料預測未來時刻的數值。近年來,深度學習模型如卷積神經網路(Convolutional Neural Network, CNN)、GRU以及注意力機制(Attention Mechanism)在時間序列預測中展現出顯著優勢。然而,模型引數的有效設定對預測效能至關重要。鯨魚最佳化(WOA)作為一種高效的全域性最佳化演算法,被引入用於最佳化深度學習模型的超引數。

3.1卷積神經網路(CNN)在時間序列中的應用

在時間序列資料中,CNN用於提取區域性特徵和模式。對於一個長度為T的時間序列資料X = [x_1, x_2, ..., x_T],透過卷積層可以生成一組特徵對映:

CNN透過多個卷積層和池化層的堆疊來提取輸入資料的特徵。每個卷積層都包含多個卷積核,用於捕捉不同的特徵。池化層則用於降低資料的維度,減少計算量並增強模型的魯棒性。

3.2 GRU網路

GRU(Gated Recurrent Unit)是一種先進的迴圈神經網路(RNN)變體,專門設計用於處理序列資料,如文字、語音、時間序列等。GRU旨在解決傳統RNN在處理長序列時可能出現的梯度消失或梯度爆炸問題,並簡化LSTM(Long Short-Term Memory)網路的結構,同時保持其捕獲長期依賴關係的能力。

GRU包含一個核心迴圈單元,該單元在每個時間步t處理輸入資料xt​並更新隱藏狀態ht​。其核心創新在於引入了兩個門控機制:更新門(Update Gate)和重置門(Reset Gate)。

3.3 注意力機制(Attention)

注意力機制是一種讓模型能夠自動地關注輸入資料中重要部分的技術。在時間序列預測中,注意力機制可以幫助模型關注與當前預測最相關的歷史資訊。

CNN-LSTM-Attention模型結合了CNN、LSTM和Attention三種技術的優勢。首先,使用CNN提取時間序列中的區域性特徵;然後,將提取的特徵輸入到LSTM中,捕捉時間序列中的長期依賴關係;最後,透過注意力機制對LSTM的輸出進行加權,使模型能夠關注與當前預測最相關的歷史資訊。具體來說,模型的流程如下:

3.4 WOA最佳化演算法

WOA即Whale Optimization Algorithm(鯨魚最佳化演算法),是一種受自然界鯨魚捕食行為啟發的生物啟發式最佳化演算法,由Eslam Mohamed於2016年提出,常用於解決各種連續最佳化問題,包括函式最佳化、機器學習引數調整、工程設計等領域中的複雜最佳化任務。鯨魚最佳化演算法模擬了虎鯨的兩種主要覓食策略: Bubble-net attacking 和 Spiral updating 過程。

4.部分核心程式

numHiddenUnits = floor(woa_idx(1))+1
LR             = woa_idx(2)
 
layers = func_model2(Dim,numHiddenUnits);
%設定
%迭代次數
%學習率為0.001
options = trainingOptions('adam', ...       
    'MaxEpochs', 1500, ...                 
    'InitialLearnRate', LR, ...          
    'LearnRateSchedule', 'piecewise', ...  
    'LearnRateDropFactor', 0.1, ...        
    'LearnRateDropPeriod', 1000, ...        
    'Shuffle', 'every-epoch', ...          
    'Plots', 'training-progress', ...     
    'Verbose', false);
 
%訓練
Net = trainNetwork(Nsp_train2, NTsp_train, layers, options);
 
%資料預測
Dpre1 = predict(Net, Nsp_train2);
Dpre2 = predict(Net, Nsp_test2);
 
%歸一化還原
T_sim1=Dpre1*Vmax2;
T_sim2=Dpre2*Vmax2;
 
 
%網路結構
analyzeNetwork(Net)
 
 
figure
subplot(211);
plot(1: Num1, Tat_train,'-bs',...
    'LineWidth',1,...
    'MarkerSize',6,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor',[0.9,0.0,0.0]);
hold on
plot(1: Num1, T_sim1,'g',...
    'LineWidth',2,...
    'MarkerSize',6,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor',[0.9,0.9,0.0]);
 
legend('真實值', '預測值')
xlabel('預測樣本')
ylabel('預測結果')
grid on
 
subplot(212);
plot(1: Num1, Tat_train-T_sim1','-bs',...
    'LineWidth',1,...
    'MarkerSize',6,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor',[0.9,0.0,0.0]);
 
xlabel('預測樣本')
ylabel('預測誤差')
grid on
ylim([-50,50]);
figure
subplot(211);
plot(1: Num2, Tat_test,'-bs',...
    'LineWidth',1,...
    'MarkerSize',6,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor',[0.9,0.0,0.0]);
hold on
plot(1: Num2, T_sim2,'g',...
    'LineWidth',2,...
    'MarkerSize',6,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor',[0.9,0.9,0.0]);
legend('真實值', '預測值')
xlabel('測試樣本')
ylabel('測試結果')
grid on
subplot(212);
plot(1: Num2, Tat_test-T_sim2','-bs',...
    'LineWidth',1,...
    'MarkerSize',6,...
    'MarkerEdgeColor','k',...
    'MarkerFaceColor',[0.9,0.0,0.0]);
 
xlabel('預測樣本')
ylabel('預測誤差')
grid on
ylim([-50,50]);
 
 
save R2.mat Num2 Tat_test T_sim2

  

相關文章