【LSTM时间序列预测】基于matlab贝叶斯网络优化LSTM时间序列预测【含Matlab源码 1329期】
一、貝葉斯網(wǎng)絡(luò)及LSTM簡介
1 貝葉斯網(wǎng)絡(luò)
貝葉斯網(wǎng)絡(luò)(Bayesian network),又稱信念網(wǎng)絡(luò)(Belief Network),或有向無環(huán)圖模型(directed acyclic graphical model),是一種概率圖模型,于1985年由Judea Pearl首先提出。它是一種模擬人類推理過程中因果關(guān)系的不確定性處理模型,其網(wǎng)絡(luò)拓樸結(jié)構(gòu)是一個有向無環(huán)圖(DAG)。
貝葉斯網(wǎng)絡(luò)的有向無環(huán)圖中的節(jié)點表示隨機變量{ X 1 , X 2 , . . . , X n }
它們可以是可觀察到的變量,或隱變量、未知參數(shù)等。認為有因果關(guān)系(或非條件獨立)的變量或命題則用箭頭來連接。若兩個節(jié)點間以一個單箭頭連接在一起,表示其中一個節(jié)點是“因(parents)”,另一個是“果(children)”,兩節(jié)點就會產(chǎn)生一個條件概率值。
例如,假設(shè)節(jié)點E直接影響到節(jié)點H,即E→H,則用從E指向H的箭頭建立結(jié)點E到結(jié)點H的有向弧(E,H),權(quán)值(即連接強度)用條件概率P(H|E)來表示,如下圖所示:
簡言之,把某個研究系統(tǒng)中涉及的隨機變量,根據(jù)是否條件獨立繪制在一個有向圖中,就形成了貝葉斯網(wǎng)絡(luò)。其主要用來描述隨機變量之間的條件依賴,用圈表示隨機變量(random variables),用箭頭表示條件依賴(conditional dependencies)。
此外,對于任意的隨機變量,其聯(lián)合概率可由各自的局部條件概率分布相乘而得出:
2.4.1 貝葉斯網(wǎng)絡(luò)的結(jié)構(gòu)形式
(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?,且根據(jù)P(a,c) = P(a)P(c|a) = P?P(a|c),可化簡得到:
所以,在c給定的條件下,a,b被阻斷(blocked),是獨立的,稱之為head-to-tail條件獨立。
這個head-to-tail其實就是一個鏈式網(wǎng)絡(luò),如下圖所示:
根據(jù)之前對head-to-tail的講解,我們已經(jīng)知道,在xi給定的條件下,xi+1的分布和x1,x2…xi-1條件獨立。意味著啥呢?意味著:xi+1的分布狀態(tài)只和xi有關(guān),和其他變量條件獨立。通俗點說,當前狀態(tài)只跟上一狀態(tài)有關(guān),跟上上或上上之前的狀態(tài)無關(guān)。這種順次演變的隨機過程,就叫做馬爾科夫鏈(Markov chain)。對于馬爾科夫鏈我們下一節(jié)再細講。
2 LSTM簡介
2.1 LSTM控制流程
LSTM的控制流程:是在前向傳播的過程中處理流經(jīng)細胞的數(shù)據(jù),不同之處在于 LSTM 中細胞的結(jié)構(gòu)和運算有所變化。
這一系列運算操作使得 LSTM具有能選擇保存信息或遺忘信息的功能。咋一看這些運算操作時可能有點復雜,但沒關(guān)系下面將帶你一步步了解這些運算操作。
2.2 核心概念
LSTM 的核心概念在于細胞狀態(tài)以及“門”結(jié)構(gòu)。細胞狀態(tài)相當于信息傳輸?shù)穆窂?#xff0c;讓信息能在序列連中傳遞下去。你可以將其看作網(wǎng)絡(luò)的“記憶”。理論上講,細胞狀態(tài)能夠?qū)⑿蛄刑幚磉^程中的相關(guān)信息一直傳遞下去。
因此,即使是較早時間步長的信息也能攜帶到較后時間步長的細胞中來,這克服了短時記憶的影響。信息的添加和移除我們通過“門”結(jié)構(gòu)來實現(xiàn),“門”結(jié)構(gòu)在訓練過程中會去學習該保存或遺忘哪些信息。
2.3 Sigmoid
門結(jié)構(gòu)中包含著 sigmoid 激活函數(shù)。Sigmoid 激活函數(shù)與 tanh 函數(shù)類似,不同之處在于 sigmoid 是把值壓縮到 0~1 之間而不是 -1~1 之間。這樣的設(shè)置有助于更新或忘記信息,因為任何數(shù)乘以 0 都得 0,這部分信息就會剔除掉。同樣的,任何數(shù)乘以 1 都得到它本身,這部分信息就會完美地保存下來。這樣網(wǎng)絡(luò)就能了解哪些數(shù)據(jù)是需要遺忘,哪些數(shù)據(jù)是需要保存。
2.4 LSTM門結(jié)構(gòu)
LSTM 有三種類型的門結(jié)構(gòu):遺忘門、輸入門和輸出門。
2.4.1 遺忘門
遺忘門的功能是決定應(yīng)丟棄或保留哪些信息。來自前一個隱藏狀態(tài)的信息和當前輸入的信息同時傳遞到 sigmoid 函數(shù)中去,輸出值介于 0 和 1 之間,越接近 0 意味著越應(yīng)該丟棄,越接近 1 意味著越應(yīng)該保留。
2.4.2 輸入門
輸入門用于更新細胞狀態(tài)。首先將前一層隱藏狀態(tài)的信息和當前輸入的信息傳遞到 sigmoid 函數(shù)中去。將值調(diào)整到 0~1 之間來決定要更新哪些信息。0 表示不重要,1 表示重要。
其次還要將前一層隱藏狀態(tài)的信息和當前輸入的信息傳遞到 tanh 函數(shù)中去,創(chuàng)造一個新的侯選值向量。最后將 sigmoid 的輸出值與 tanh 的輸出值相乘,sigmoid 的輸出值將決定 tanh 的輸出值中哪些信息是重要且需要保留下來的。
2.4.3 細胞狀態(tài)
下一步,就是計算細胞狀態(tài)。首先前一層的細胞狀態(tài)與遺忘向量逐點相乘。如果它乘以接近 0 的值,意味著在新的細胞狀態(tài)中,這些信息是需要丟棄掉的。然后再將該值與輸入門的輸出值逐點相加,將神經(jīng)網(wǎng)絡(luò)發(fā)現(xiàn)的新信息更新到細胞狀態(tài)中去。至此,就得到了更新后的細胞狀態(tài)。
2.4.4 輸出門
輸出門用來確定下一個隱藏狀態(tài)的值,隱藏狀態(tài)包含了先前輸入的信息。首先,我們將前一個隱藏狀態(tài)和當前輸入傳遞到 sigmoid 函數(shù)中,然后將新得到的細胞狀態(tài)傳遞給 tanh 函數(shù)。
最后將 tanh 的輸出與 sigmoid 的輸出相乘,以確定隱藏狀態(tài)應(yīng)攜帶的信息。再將隱藏狀態(tài)作為當前細胞的輸出,把新的細胞狀態(tài)和新的隱藏狀態(tài)傳遞到下一個時間步長中去。
讓我們再梳理一下。遺忘門確定前一個步長中哪些相關(guān)的信息需要被保留;輸入門確定當前輸入中哪些信息是重要的,需要被添加的;輸出門確定下一個隱藏狀態(tài)應(yīng)該是什么。
二、部分源代碼
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三、運行結(jié)果
四、matlab版本及參考文獻
1 matlab版本
2014a
2 參考文獻
[1] 包子陽,余繼周,楊杉.智能優(yōu)化算法及其MATLAB實例(第2版)[M].電子工業(yè)出版社,2016.
[2]張巖,吳水根.MATLAB優(yōu)化算法源代碼[M].清華大學出版社,2017.
[3]周品.MATLAB 神經(jīng)網(wǎng)絡(luò)設(shè)計與應(yīng)用[M].清華大學出版社,2013.
[4]陳明.MATLAB神經(jīng)網(wǎng)絡(luò)原理與實例精解[M].清華大學出版社,2013.
[5]方清城.MATLAB R2016a神經(jīng)網(wǎng)絡(luò)設(shè)計與應(yīng)用28個案例分析[M].清華大學出版社,2018.
總結(jié)
以上是生活随笔為你收集整理的【LSTM时间序列预测】基于matlab贝叶斯网络优化LSTM时间序列预测【含Matlab源码 1329期】的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python划分训练集和测试集_pyth
- 下一篇: 训练集、验证集、测试集的作用