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

简简单单做算法發表於2024-03-26

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

最佳化前:

最佳化後:

2.演算法執行軟體版本

matlab2022a

3.演算法理論概述

時間序列預測是許多領域中的核心問題,如金融市場分析、氣候預測、交通流量預測等。近年來,深度學習在時間序列分析上取得了顯著的成果,尤其是卷積神經網路(CNN)、長短時記憶網路(LSTM)和注意力機制(Attention)的結合使用。

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

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

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

3.2 長短時記憶網路(LSTM)處理序列依賴關係

LSTM單元能夠有效捕捉時間序列中的長期依賴關係。在一個時間步t,LSTM的內部狀態h_t和隱藏狀態c_t更新如下:

長短時記憶網路是一種特殊的迴圈神經網路(RNN),設計用於解決長序列依賴問題。在時間序列預測中,LSTM能夠有效地捕捉時間序列中的長期依賴關係。

3.3 注意力機制(Attention)

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

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

使用CNN處理原始時間序列資料,提取區域性特徵。這可以透過多個卷積層和池化層的堆疊來實現。

將CNN的輸出作為LSTM的輸入,捕捉時間序列中的長期依賴關係。這裡可以使用多層LSTM來增強模型的表達能力。

在LSTM的輸出上應用注意力機制,計算每個歷史時刻的注意力權重,並生成上下文向量。這個上下文向量包含了所有歷史時刻的資訊,但已經根據當前時刻的查詢進行了加權。

將上下文向量與當前時刻的輸入或隱藏狀態進行融合,生成最終的預測結果。這可以透過一個簡單的全連線層來實現。

3.4GA最佳化

遺傳演算法是一種啟發式搜尋演算法,用於最佳化模型的超引數。它透過模擬自然選擇和遺傳學的原理,在搜尋空間中尋找最優解。GA的基本步驟包括初始化種群、計算適應度、選擇、交叉和變異。在模型最佳化中,種群的個體可以表示不同的超引數組合,適應度函式可以基於模型在驗證集上的效能來定義。透過多輪的選擇、交叉和變異操作,GA能夠找到一組最優的超引數組合,使得模型在測試集上達到最佳效能。

該模型結合了CNN、GRU和Attention機制的優勢,用於處理時間序列資料。CNN擅長捕捉區域性特徵,GRU能夠處理序列資料的長期依賴關係,而Attention機制則允許模型在預測時關注最重要的資訊。遺傳演算法(GA)用於最佳化模型的超引數,如學習率、層數、神經元數量等。

4.部分核心程式

while gen < MAXGEN
      gen
      Pe0 = 0.999;
      pe1 = 0.001; 
 
      FitnV=ranking(Objv);    
      Selch=select('sus',Chrom,FitnV);    
      Selch=recombin('xovsp', Selch,Pe0);   
      Selch=mut( Selch,pe1);   
      phen1=bs2rv(Selch,FieldD);   
 
      for a=1:1:NIND  
          X           = phen1(a,:);
          %計算對應的目標值
          [epls]      = func_obj(X);
          E           = epls;
          JJ(a,1)     = E;
      end 
      
      Objvsel=(JJ);    
      [Chrom,Objv]=reins(Chrom,Selch,1,1,Objv,Objvsel);   
      gen=gen+1; 
 
 
      Error2(gen) = mean(JJ);
end 
figure
plot(smooth(Error2,MAXGEN),'linewidth',2);
grid on
xlabel('迭代次數');
ylabel('遺傳演算法最佳化過程');
legend('Average fitness');
 
 
 
[V,I] = min(JJ);
X     = phen1(I,:);
 
LR             = X(1);
numHiddenUnits = floor(X(2))+1;% 定義隱藏層中LSTM單元的數量
 
%CNN-GRU-ATT
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

  

相關文章