clc; clear; close all;
%% 变量初始化
opt.Delays = 1:30;
%数据标准化: 'None' 'Data Standardization' 'Data Normalization'
opt.dataPreprocessMode = 'Data Standardization';
opt.learningMethod = 'LSTM';
%数据划分
opt.trPercentage = 0.80;
%% 参数定义
%最大迭代次数
opt.maxEpochs = 10;
%批处理大小
opt.miniBatchSize = 16;
%执行环境: 'cpu' 'gpu' 'auto'
opt.executionEnvironment = 'cpu';
%优化算法: 'sgdm' 'rmsprop' 'adam'
opt.LR = 'adam';
%训练进程: 'training-progress' 'none'
opt.trainingProgress = 'none';
%% 双向长短期参数设定
%逻辑参数控制是否双向
opt.isUseBiLSTMLayer = true;
opt.isUseDropoutLayer = true;
%权重丢失参数设定,防止过拟合
opt.DropoutValue = 0.5;
% 优化参数设定
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 = 10;
opt.isDispOptimizationLog = true;
%参数保存设定
opt.isSaveOptimizedValue = false;
opt.isSaveBestOptimizedValue = true;
%% 数据导入
data.CompleteData = readtable('data.xlsx','Sheet',1);
data.seriesdataHeder = data.CompleteData.Properties.VariableNames(1,:);
data.seriesdata = table2array(data.CompleteData(:,:));
disp('数据导入成功');
data.isDataRead = true;
figure('Name','InputData','NumberTitle','off');
plot(data.seriesdata,'--','Color',[0 0 180]./255,'linewidth',2,'Markersize',4,'MarkerFaceColor',[0 0 180]./255);
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')
for i=1:size(data.seriesdata,2)
data.x(:,i) = (data.seriesdata(:,i) -min(data.seriesdata(:,i)))./ (max(data.seriesdata(:,i))-min(data.seriesdata(:,i)));
end
figure('Name','NormilizedInputData','NumberTitle','off');
plot(data.x,'--','Color',[255 0 0]./255,'linewidth',2,'Markersize',4,'MarkerFaceColor',[255 0 0]./255);
grid minor;
title({['Mean = ' num2str(mean(data.x)) ', STD = ' num2str(std(data.x)) ];});
elseif strcmpi(opt.dataPreprocessMode,'Data Standardization')
for i=1:size(data.seriesdata,2)
x.mu(1,i) = mean(data.seriesdata(:,i),'omitnan');
x.sig(1,i) = std (data.seriesdata(:,i),'omitnan');
data.x(:,i) = (data.seriesdata(:,i) - x.mu(1,i))./ x.sig(1,i);
end
figure('Name','NormilizedInputData','NumberTitle','off');
plot(data.x,'--','Color',[255 0 0]./255,'linewidth',2,'Markersize',4,'MarkerFaceColor',[255 0 0]./255); grid minor;
title({['Mean = ' num2str(mean(data.x)) ', STD = ' num2str(std(data.x)) ];});
end
%% 数据准备
% LSTM数据准备
% 网络时间延迟设定
Delays = opt.Delays;
x = data.x';
T = size(x,2);
MaxDelay = max(Delays);
Range = MaxDelay+1:T;
X= [];
for d = Delays
X=[X; x(:,Range-d)];
end
Y = x(:,Range);
data.X = X;
data.Y = Y;
% 数据划分
data.XTr = [];
data.YTr = [];
data.XTs = [];
data.YTs = [];
numTrSample = round(opt.trPercentage*size(data.X,2));
data.XTr = data.X(:,1:numTrSample);
data.YTr = data.Y(:,1:numTrSample);
data.XTs = data.X(:,numTrSample+1:end);
data.YTs = data.Y(:,numTrSample+1:end);
disp(['Time Series data divided to ' num2str(opt.trPercentage*100) '% Train data and ' num2str((1-opt.trPercentage)*100) '% Test data']);
% 数据规范化
for i=1:size(data.XTr,2)
XTr{i,1} = data.XTr(:,i);
YTr(i,1) = data.YTr(:,i);
end
for i=1:size(data.XTs,2)
XTs{i,1} = data.XTs(:,i);
YTs(i,1) = data.YTs(:,i);
end
data.XTr = XTr;
data.YTr = YTr;
data.XTs = XTs;
data.YTs = YTs;
data.XVl = XTs;
data.YVl = YTs;
disp('输入数据时间序列适应LSTM');
%% 基于贝叶斯寻找最佳LSTM参数
% 超参数运行
if opt.isDispOptimizationLog
isLog = 2;
else
isLog = 0;
end
if opt.isUseOptimizer
opt.ObjFcn = ObjFcn(opt,data);
BayesObject = bayesopt(opt.ObjFcn,opt.optimVars, ...
'MaxTime',opt.MaxOptimizationTime, ...
'IsObjectiveDeterministic',false, ...
'MaxObjectiveEvaluations',opt.MaxItrationNumber,...
'Verbose',isLog,...
'UseParallel',false);
end
%% 数据评价
[opt,data] = EvaluationData(opt,data);
%% 本地子函数
% 目标函数
function ObjFcnn = ObjFcn(opt,data)
ObjFcnn = @CostFunction;
function [valError,cons,fileName] = CostFunction(optVars)
inputSize = size(data.X,1);
numResponses = 1;
dropoutVal = 0.5;
if optVars.isUseBiLSTMLayer == 2
optVars.isUseBiLSTMLayer = 0;
end
% if dropout layer is true
if opt.isUseDropoutLayer
if optVars.NumOfLayer ==1
if optVars.isUseBiLSTMLayer
opt.layers = [ ...
sequenceInputLayer(inputSize)
bilstmLayer(optVars.NumOfUnits,'OutputMode','last')
dropoutLayer(dropoutVal)
fullyConnectedLayer(numResponses)
regressionLayer];
else
opt.layers = [ ...
sequenceInputLayer(inputSize)
lstmLayer(optVars.NumOfUnits,'OutputMode','last')
dropoutLayer(dropoutVal)
fullyConnectedLayer(numResponses)
regressionLayer];
end
elseif optVars.NumOfLayer==2
if optVars.isUseBiLSTMLayer
opt.layers = [ ...
sequenceInputLayer(inputSize)
bilstmLayer(optVars.NumOfUnits,'OutputMode','sequence')
dropoutLayer(dropoutVal)
bilstmLayer(optVars.NumOfUnits,'OutputMode','last')
dropoutLayer(dropoutVal)
fullyConnectedLayer(numResponses)
regressionLayer];
else
opt.layers = [ ...
sequenceInputLayer(inputSize)
lstmLayer(optVars.NumOfUnits,'OutputMode','sequence')
dropoutLayer(dropoutVal)
lstmLayer(optVars.NumOfUnits,'OutputMode','last')
dropoutLayer(dropoutVal)
fullyConnectedLayer(numResponses)
regressionLayer];
end
elseif optVars.NumOfLayer ==3
if optVars.isUseBiLSTMLayer
opt.layers = [ ...
sequenceInputLayer(inputSize)
bilstmLayer(optVars.NumOfUnits,'OutputMode','sequence')
dropoutLayer(dropoutVal)
bilstmLayer(optVars.NumOfUnits,'OutputMode','sequence')
dropoutLayer(dropoutVal)
bilstmLayer(optVars.NumOfUnits,'OutputMode','last')
dropoutLayer(dropoutVal)
fullyConnectedLayer(numResponses)
regressionLayer];
else
opt.layers = [ ...
sequenceInputLayer(inputSize)
bilstmLayer(optVars.NumOfUnits,'OutputMode','sequence')
dropoutLayer(dropoutVal)
bilstmLayer(optVars.NumOfUnits,'OutputMode','sequence')
dropoutLayer(dropoutVal)
bilstmLayer(optVars.NumOfUnits,'OutputMode','last')
dropoutLayer(dropoutVal)
fullyConnectedLayer(numResponses)
regressionLayer];
end
elseif optVars.NumOfLayer==4
if optVars.isUseBiLSTMLayer
opt.layers = [ ...
sequenceInputLayer(inputSize)
bilstmLayer(optVars.NumOfUnits,'OutputMode','sequence')
dropoutLayer(dropoutVal)
bilstmLayer(optVars.NumOfUnits,'OutputMode','sequence')
dropoutLayer(dropoutVa
- 1
- 2
- 3
- 4
- 5
前往页