【LSTM时间序列预测】基于matlab贝叶斯网络优化LSTM时间序列预测【含Matlab源码 1329期】
一、貝葉斯網絡及LSTM簡介
1 貝葉斯網絡
貝葉斯網絡(Bayesian network),又稱信念網絡(Belief Network),或有向無環圖模型(directed acyclic graphical model),是一種概率圖模型,于1985年由Judea Pearl首先提出。它是一種模擬人類推理過程中因果關系的不確定性處理模型,其網絡拓樸結構是一個有向無環圖(DAG)。
貝葉斯網絡的有向無環圖中的節點表示隨機變量{ X 1 , X 2 , . . . , X n }
它們可以是可觀察到的變量,或隱變量、未知參數等。認為有因果關系(或非條件獨立)的變量或命題則用箭頭來連接。若兩個節點間以一個單箭頭連接在一起,表示其中一個節點是“因(parents)”,另一個是“果(children)”,兩節點就會產生一個條件概率值。
例如,假設節點E直接影響到節點H,即E→H,則用從E指向H的箭頭建立結點E到結點H的有向弧(E,H),權值(即連接強度)用條件概率P(H|E)來表示,如下圖所示:
簡言之,把某個研究系統中涉及的隨機變量,根據是否條件獨立繪制在一個有向圖中,就形成了貝葉斯網絡。其主要用來描述隨機變量之間的條件依賴,用圈表示隨機變量(random variables),用箭頭表示條件依賴(conditional dependencies)。
此外,對于任意的隨機變量,其聯合概率可由各自的局部條件概率分布相乘而得出:
2.4.1 貝葉斯網絡的結構形式
(1) head-to-head
依上圖,所以有:P(a,b,c) = P(a)*P(b)P(c|a,b)成立,即在c未知的條件下,a、b被阻斷(blocked),是獨立的,稱之為head-to-head條件獨立。
(2) tail-to-tail
考慮c未知,跟c已知這兩種情況:
在c未知的時候,有:P(a,b,c)=P?P(a|c)P(b|c),此時,沒法得出P(a,b) = P(a)P(b),即c未知時,a、b不獨立。
在c已知的時候,有:P(a,b|c)=P(a,b,c)/P?,然后將P(a,b,c)=P?P(a|c)P(b|c)帶入式子中,得到:P(a,b|c)=P(a,b,c)/P? = P?P(a|c)*P(b|c) / P? = P(a|c)*P(b|c),即c已知時,a、b獨立。
(3)head-to-tail
還是分c未知跟c已知這兩種情況:
c未知時,有:P(a,b,c)=P(a)*P(c|a)*P(b|c),但無法推出P(a,b) = P(a)P(b),即c未知時,a、b不獨立。
c已知時,有:P(a,b|c)=P(a,b,c)/P?,且根據P(a,c) = P(a)P(c|a) = P?P(a|c),可化簡得到:
所以,在c給定的條件下,a,b被阻斷(blocked),是獨立的,稱之為head-to-tail條件獨立。
這個head-to-tail其實就是一個鏈式網絡,如下圖所示:
根據之前對head-to-tail的講解,我們已經知道,在xi給定的條件下,xi+1的分布和x1,x2…xi-1條件獨立。意味著啥呢?意味著:xi+1的分布狀態只和xi有關,和其他變量條件獨立。通俗點說,當前狀態只跟上一狀態有關,跟上上或上上之前的狀態無關。這種順次演變的隨機過程,就叫做馬爾科夫鏈(Markov chain)。對于馬爾科夫鏈我們下一節再細講。
2 LSTM簡介
2.1 LSTM控制流程
LSTM的控制流程:是在前向傳播的過程中處理流經細胞的數據,不同之處在于 LSTM 中細胞的結構和運算有所變化。
這一系列運算操作使得 LSTM具有能選擇保存信息或遺忘信息的功能。咋一看這些運算操作時可能有點復雜,但沒關系下面將帶你一步步了解這些運算操作。
2.2 核心概念
LSTM 的核心概念在于細胞狀態以及“門”結構。細胞狀態相當于信息傳輸的路徑,讓信息能在序列連中傳遞下去。你可以將其看作網絡的“記憶”。理論上講,細胞狀態能夠將序列處理過程中的相關信息一直傳遞下去。
因此,即使是較早時間步長的信息也能攜帶到較后時間步長的細胞中來,這克服了短時記憶的影響。信息的添加和移除我們通過“門”結構來實現,“門”結構在訓練過程中會去學習該保存或遺忘哪些信息。
2.3 Sigmoid
門結構中包含著 sigmoid 激活函數。Sigmoid 激活函數與 tanh 函數類似,不同之處在于 sigmoid 是把值壓縮到 0~1 之間而不是 -1~1 之間。這樣的設置有助于更新或忘記信息,因為任何數乘以 0 都得 0,這部分信息就會剔除掉。同樣的,任何數乘以 1 都得到它本身,這部分信息就會完美地保存下來。這樣網絡就能了解哪些數據是需要遺忘,哪些數據是需要保存。
2.4 LSTM門結構
LSTM 有三種類型的門結構:遺忘門、輸入門和輸出門。
2.4.1 遺忘門
遺忘門的功能是決定應丟棄或保留哪些信息。來自前一個隱藏狀態的信息和當前輸入的信息同時傳遞到 sigmoid 函數中去,輸出值介于 0 和 1 之間,越接近 0 意味著越應該丟棄,越接近 1 意味著越應該保留。
2.4.2 輸入門
輸入門用于更新細胞狀態。首先將前一層隱藏狀態的信息和當前輸入的信息傳遞到 sigmoid 函數中去。將值調整到 0~1 之間來決定要更新哪些信息。0 表示不重要,1 表示重要。
其次還要將前一層隱藏狀態的信息和當前輸入的信息傳遞到 tanh 函數中去,創造一個新的侯選值向量。最后將 sigmoid 的輸出值與 tanh 的輸出值相乘,sigmoid 的輸出值將決定 tanh 的輸出值中哪些信息是重要且需要保留下來的。
2.4.3 細胞狀態
下一步,就是計算細胞狀態。首先前一層的細胞狀態與遺忘向量逐點相乘。如果它乘以接近 0 的值,意味著在新的細胞狀態中,這些信息是需要丟棄掉的。然后再將該值與輸入門的輸出值逐點相加,將神經網絡發現的新信息更新到細胞狀態中去。至此,就得到了更新后的細胞狀態。
2.4.4 輸出門
輸出門用來確定下一個隱藏狀態的值,隱藏狀態包含了先前輸入的信息。首先,我們將前一個隱藏狀態和當前輸入傳遞到 sigmoid 函數中,然后將新得到的細胞狀態傳遞給 tanh 函數。
最后將 tanh 的輸出與 sigmoid 的輸出相乘,以確定隱藏狀態應攜帶的信息。再將隱藏狀態作為當前細胞的輸出,把新的細胞狀態和新的隱藏狀態傳遞到下一個時間步長中去。
讓我們再梳理一下。遺忘門確定前一個步長中哪些相關的信息需要被保留;輸入門確定當前輸入中哪些信息是重要的,需要被添加的;輸出門確定下一個隱藏狀態應該是什么。
二、部分源代碼
clc; clear; close all; %% ---------------------------- init Variabels ---------------------------- opt.Delays = 1:30; opt.dataPreprocessMode = 'Data Standardization'; % 'None' 'Data Standardization' 'Data Normalization' opt.learningMethod = 'LSTM'; opt.trPercentage = 0.80; % divide data into Test and Train dataset% ---- General Deep Learning Parameters(LSTM and CNN General Parameters) opt.maxEpochs = 400; % maximum number of training Epoch in deeplearning algorithms. opt.miniBatchSize = 32; % minimum batch size in deeplearning algorithms . opt.executionEnvironment = 'cpu'; % 'cpu' 'gpu' 'auto' opt.LR = 'adam'; % 'sgdm' 'rmsprop' 'adam' opt.trainingProgress = 'none'; % 'training-progress' 'none'% ------------- BILSTM parameters opt.isUseBiLSTMLayer = true; % if it is true the layer turn to the Bidirectional-LSTM and if it is false it will turn the units to the simple LSTM opt.isUseDropoutLayer = true; % dropout layer avoid of bieng overfit opt.DropoutValue = 0.5;% ------------ Optimization Parameters opt.optimVars = [optimizableVariable('NumOfLayer',[1 4],'Type','integer')optimizableVariable('NumOfUnits',[50 200],'Type','integer')optimizableVariable('isUseBiLSTMLayer',[1 2],'Type','integer')optimizableVariable('InitialLearnRate',[1e-2 1],'Transform','log')optimizableVariable('L2Regularization',[1e-10 1e-2],'Transform','log')];opt.isUseOptimizer = true;opt.MaxOptimizationTime = 14*60*60; opt.MaxItrationNumber = 60; opt.isDispOptimizationLog = true;opt.isSaveOptimizedValue = false; % save all of Optimization output on mat files opt.isSaveBestOptimizedValue = true; % save Best Optimization output o? a mat file %% --------------- load Data data = loadData(opt); if ~data.isDataReadreturn; end%% --------------- Prepair Data [opt,data] = PrepareData(opt,data);%% --------------- Find Best LSTM Parameters with Bayesian Optimization [opt,data] = OptimizeLSTM(opt,data);%% --------------- Evaluate Data [opt,data] = EvaluationData(opt,data);%% ---------------------------- Local Functions --------------------------- function data = loadData(opt) [chosenfile,chosendirectory] = uigetfile({'*.xlsx';'*.csv'},...'Select Excel time series Data sets','data.xlsx'); filePath = [chosendirectory chosenfile]; if filePath ~= 0data.DataFileName = chosenfile;data.CompleteData = readtable(filePath);if size(data.CompleteData,2)>1warning('Input data should be an excel file with only one column!');disp('Operation Failed... '); pause(.9);disp('Reloading data. '); pause(.9);data.x = [];data.isDataRead = false;return;enddata.seriesdataHeder = data.CompleteData.Properties.VariableNames(1,:);data.seriesdata = table2array(data.CompleteData(:,:));disp('Input data successfully read.');data.isDataRead = true;data.seriesdata = PreInput(data.seriesdata);figure('Name','InputData','NumberTitle','off');plot(data.seriesdata); grid minor;title({['Mean = ' num2str(mean(data.seriesdata)) ', STD = ' num2str(std(data.seriesdata)) ];});if strcmpi(opt.dataPreprocessMode,'None')data.x = data.seriesdata;elseif strcmpi(opt.dataPreprocessMode,'Data Normalization')data.x = DataNormalization(data.seriesdata);figure('Name','NormilizedInputData','NumberTitle','off');plot(data.x); grid minor;title({['Mean = ' num2str(mean(data.x)) ', STD = ' num2str(std(data.x)) ];});elseif strcmpi(opt.dataPreprocessMode,'Data Standardization')data.x = DataStandardization(data.seriesdata);figure('Name','NormilizedInputData','NumberTitle','off');plot(data.x); grid minor;title({['Mean = ' num2str(mean(data.x)) ', STD = ' num2str(std(data.x)) ];});endelsewarning(['In order to train network, please load data.' ...'Input data should be an excel file with only one column!']);disp('Operation Cancel.');data.isDataRead = false; end end function data = PreInput(data) if iscell(data)for i=1:size(data,1)for j=1:size(data,2)if strcmpi(data{i,j},'#NULL!')tempVars(i,j) = NaN; %#okelsetempVars(i,j) = str2num(data{i,j}); %#okendendenddata = tempVars; end end function vars = DataStandardization(data) for i=1:size(data,2)x.mu(1,i) = mean(data(:,i),'omitnan');x.sig(1,i) = std (data(:,i),'omitnan');vars(:,i) = (data(:,i) - x.mu(1,i))./ x.sig(1,i); end end function vars = DataNormalization(data) for i=1:size(data,2)vars(:,i) = (data(:,i) -min(data(:,i)))./ (max(data(:,i))-min(data(:,i))); end end % --------------- data preparation for LSTM --- function [opt,data] = PrepareData(opt,data) % prepare delays for time serie network data = CreateTimeSeriesData(opt,data);% divide data into test and train data data = dataPartitioning(opt,data);% LSTM data form data = LSTMInput(data); end% ----Run Bayesian Optimization Hyperparameters for LSTM Network Parameters function [opt,data] = OptimizeLSTM(opt,data) if opt.isDispOptimizationLogisLog = 2; elseisLog = 0; end if opt.isUseOptimizeropt.ObjFcn = ObjFcn(opt,data);BayesObject = bayesopt(opt.ObjFcn,opt.optimVars, ...'MaxTime',opt.MaxOptimizationTime, ...'IsObjectiveDeterministic',false, ...'MaxObjectiveEvaluations',opt.MaxItrationNumber,...'Verbose',isLog,...'UseParallel',false); end end% ---------------- objective function function ObjFcn = ObjFcn(opt,data) ObjFcn = @CostFunction;function [valError,cons,fileName] = CostFunction(optVars) inputSize = size(data.X,1); outputMode = 'last'; numResponses = 1; dropoutVal = .5;if optVars.isUseBiLSTMLayer == 2optVars.isUseBiLSTMLayer = 0; endif opt.isUseDropoutLayer % if dropout layer is trueif optVars.NumOfLayer ==1if optVars.isUseBiLSTMLayeropt.layers = [ ...sequenceInputLayer(inputSize)bilstmLayer(optVars.NumOfUnits,'OutputMode',outputMode)dropoutLayer(dropoutVal)fullyConnectedLayer(numResponses)regressionLayer];elseopt.layers = [ ...sequenceInputLayer(inputSize)lstmLayer(optVars.NumOfUnits,'OutputMode',outputMode)dropoutLayer(dropoutVal)fullyConnectedLayer(numResponses)regressionLayer];endelseif optVars.NumOfLayer==2if optVars.isUseBiLSTMLayeropt.layers = [ ...sequenceInputLayer(inputSize)bilstmLayer(optVars.NumOfUnits,'OutputMode','sequence')dropoutLayer(dropoutVal)bilstmLayer(optVars.NumOfUnits,'OutputMode',outputMode)dropoutLayer(dropoutVal)fullyConnectedLayer(numResponses)regressionLayer];elseopt.layers = [ ...sequenceInputLayer(inputSize)lstmLayer(optVars.NumOfUnits,'OutputMode','sequence')dropoutLayer(dropoutVal)lstmLayer(optVars.NumOfUnits,'OutputMode',outputMode)dropoutLayer(dropoutVal)fullyConnectedLayer(numResponses)regressionLayer];end三、運行結果
四、matlab版本及參考文獻
1 matlab版本
2014a
2 參考文獻
[1] 包子陽,余繼周,楊杉.智能優化算法及其MATLAB實例(第2版)[M].電子工業出版社,2016.
[2]張巖,吳水根.MATLAB優化算法源代碼[M].清華大學出版社,2017.
[3]周品.MATLAB 神經網絡設計與應用[M].清華大學出版社,2013.
[4]陳明.MATLAB神經網絡原理與實例精解[M].清華大學出版社,2013.
[5]方清城.MATLAB R2016a神經網絡設計與應用28個案例分析[M].清華大學出版社,2018.
總結
以上是生活随笔為你收集整理的【LSTM时间序列预测】基于matlab贝叶斯网络优化LSTM时间序列预测【含Matlab源码 1329期】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python划分训练集和测试集_pyth
- 下一篇: 训练集、验证集、测试集的作用