LSTM多变量时序预测MATLAB代码模板

单序列:http://t.csdn.cn/GKZbW

LSTM时间序列预测,多输入单输出;

数据:https://pan.quark.cn/s/3548fcf2d502

%% 1.环境清理
clear, clc, close all;
%2.导入数据,多序列,多输入单输出
%有"自己设定"的一行,要根据自己数据设定值
D=readmatrix('副本data.xlsx');%"自己设定"
%要求一行为一组,最后一列为输出
data=D;
data1=data;
%% 3.数据处理
nn=130;%训练数据集大小,"自己设定"
numTimeStepsTrain = floor(nn);%nn数据训练 ,N-nn个用来验证
[data_in,PS_in]=mapminmax(data1(:,1:end-1)');
[data_out,PS_out]=mapminmax(data1(:,end)');
data=[data_in;data_out];
data=data';
[XTrain,YTrain,XTest] = shujuchuli(data,numTimeStepsTrain);
dataTest = data(numTimeStepsTrain+1:end,:);
YTest = dataTest(:,end)';
%% 4.定义LSTM结构参数
numFeatures= 6;%输入节点,"自己设定"
numResponses = 1;%输出节点
numHiddenUnits = 600;%隐含层神经元节点数 ,"自己设定"
 
%构建 LSTM网络 
layers = [sequenceInputLayer(numFeatures) 
 lstmLayer(numHiddenUnits) %lstm函数 
dropoutLayer(0.2)%丢弃层概率 
 reluLayer('name','relu')% 激励函数 RELU 
fullyConnectedLayer(numResponses)
regressionLayer];
 
XTrain=XTrain';
YTrain=YTrain';
 
%% 5.定义LSTM函数参数 
def_options();
%% 6.训练LSTM网络 
net = trainNetwork(XTrain,YTrain,layers,options);
 
%% 7.建立训练模型 
net = predictAndUpdateState(net,XTrain);
 
%% 8.仿真预测(训练集) 
%M = numel(XTrain);
M=length(XTrain(1,:));
for i = 1:M
    [net,YPred_1(:,i)] = predictAndUpdateState(net,XTrain(:,i),'ExecutionEnvironment','cpu');
end
T_sim1=mapminmax("reverse",YPred_1,PS_out);%预测结果去标准化 ,恢复原来的数量级 
%% 9.仿真预测(验证集) 
N=length(XTest(1,:));
for i = 1:N
    [net,YPred_2(:,i)] = predictAndUpdateState(net,XTest(:,i),'ExecutionEnvironment','cpu');%
end
T_sim2=mapminmax("reverse",YPred_2,PS_out);%预测结果去标准化 ,恢复原来的数量级 
%% 10.评价指标
%  均方根误差
T_train=data1(1:M,end)';
T_test=data1(M+1:end,end)';
error1 = sqrt(sum((T_sim1 - T_train).^2) ./ M);
error2 = sqrt(sum((T_sim2 - T_test ).^2) ./ N);
%  MAE
mae1 = sum(abs(T_sim1 - T_train)) ./ M ;
mae2 = sum(abs(T_sim2 - T_test )) ./ N ;
disp(['训练集数据的MAE为:', num2str(mae1)])
disp(['验证集数据的MAE为:', num2str(mae2)])
%  MAPE
maep1 = sum(abs(T_sim1 - T_train)./T_train) ./ M ;
maep2 = sum(abs(T_sim2 - T_test )./T_test) ./ N ;
disp(['训练集数据的MAPE为:', num2str(maep1)])
disp(['验证集数据的MAPE为:', num2str(maep2)])
%  RMSE
RMSE1 = sqrt(sumsqr(T_sim1 - T_train)/M);
RMSE2 = sqrt(sumsqr(T_sim2 - T_test)/N);
disp(['训练集数据的RMSE为:', num2str(RMSE1)])
disp(['验证集数据的RMSE为:', num2str(RMSE2)])
%% 11. 绘图
figure
subplot(2,1,1)
plot(T_sim1,'-s','Color',[255 0 0]./255,'linewidth',1,'Markersize',5,'MarkerFaceColor',[250 0 0]./255)
hold on 
plot(T_train,'-o','Color',[150 150 150]./255,'linewidth',0.8,'Markersize',4,'MarkerFaceColor',[150 150 150]./255)
legend( 'LSTM拟合训练数据','实际分析数据','Location','best');
title('LSTM模型预测结果及真实值','fontsize',12)
xlabel('样本','fontsize',12);
ylabel('数值','fontsize',12);
xlim([1 M])
%-------------------------------------------------------------------------------------
subplot(2,1,2)
bar((T_sim1 - T_train)./T_train)   
legend('LSTM模型训练集相对误差','Location','best')
title('LSTM模型训练集相对误差','fontsize',12)
ylabel('误差','fontsize',12)
xlabel('样本','fontsize',12)
xlim([1 M]);
%-------------------------------------------------------------------------------------
figure
subplot(2,1,1)
plot(T_sim2,'-s','Color',[0 0 255]./255,'linewidth',1,'Markersize',5,'MarkerFaceColor',[0 0 255]./255)
hold on 
plot(T_test,'-o','Color',[0 0 0]./255,'linewidth',0.8,'Markersize',4,'MarkerFaceColor',[0 0 0]./255)
legend('LSTM预测测试数据','实际分析数据','Location','best');
title('LSTM模型预测结果及真实值','fontsize',12)
xlabel('样本','fontsize',12);
ylabel('数值','fontsize',12);
xlim([1 N])
%-------------------------------------------------------------------------------------
subplot(2,1,2)
bar((T_sim2 - T_test )./T_test)   
legend('LSTM模型测试集相对误差','Location','NorthEast')
title('LSTM模型测试集相对误差','fontsize',12)
ylabel('误差','fontsize',12)
xlabel('样本','fontsize',12)
xlim([1 N]);
 
%% 12.预测新值
X=[50,30,6,200,20,8;71.5,22.5,0.2,300,90,35];%输入新的自变量组,一行为一组
X=mapminmax("apply",X',PS_in);
bzh_sim = yuceweilai(net,XTrain,X);
T_sim3=mapminmax("reverse",bzh_sim,PS_out)

shujuchuli.m

function [XTrain,YTrain,XTest] = shujuchuli(data,numTimeStepsTrain)
dataTrain = data(1:numTimeStepsTrain,:);% 训练样本
dataTest = data(numTimeStepsTrain+1:end,:); %验证样本  
XTrain = dataTrain(:,1:end-1);
YTrain = dataTrain(:,end);% 训练输出
XTest = dataTest(:,1:end-1);%测试输入 

XTest=XTest';
end

yuceweilai.m

function [T_sim3] = yuceweilai(net,XTrain,data_X)
net1 = resetState(net);
net1 = predictAndUpdateState(net1,XTrain);
P=size(data_X,2);
for i = 1:P
    [net1,YPred_3(i)] = predictAndUpdateState(net1,data_X(:,i),'ExecutionEnvironment','cpu');
end
T_sim3=YPred_3;
end

def_options.m

options = trainingOptions('adam', ... % adam优化算法 自适应学习率 
'MaxEpochs',500,...% 最大迭代次数 
 'MiniBatchSize',10, ...%最小批处理数量 
'GradientThreshold',1, ...%防止梯度爆炸 
'InitialLearnRate',0.005, ...% 初始学习率 
'LearnRateSchedule','piecewise', ...
 'LearnRateDropPeriod',125, ...%125次后 ,学习率下降 
'LearnRateDropFactor',0.2, ...%下降因子 0.2
'ValidationData',{XTrain,YTrain}, ...
 'ValidationFrequency',5, ...%每五步验证一次 
'Verbose',1, ...
 'Plots','training-progress');

运行结果:

085d661d765d4b66b499e685bd25dfa4.bmp

 3948c89b60124c71aadf374c28cb9b35.bmp

 

 

 

 

  • 24
    点赞
  • 201
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 32
    评论
BiLSTM(双向长短期记忆网络)是一种递归神经网络结构,通过同时利用前后序列信息来进行时序预测。下面是一个用MATLAB实现的BiLSTM变量时序预测的源代码示例: ```matlab % 导入数据 data = load('data.mat'); % 假设数据保存在data.mat文件中 sequence = data.sequence; % 获得时序数据 labels = data.labels; % 获得标签数据 % 数据预处理 sequence = normalize(sequence); % 归一化处理 labels = categorical(labels); % 转换为分类变量 % 构建BiLSTM模型 numFeatures = size(sequence,2); % 特征数量 numHiddenUnits = 100; % 隐藏单元数量 numClasses = numel(categories(labels)); % 类别数量 layers = [ ... sequenceInputLayer(numFeatures) bilstmLayer(numHiddenUnits,'OutputMode','last') fullyConnectedLayer(numClasses) softmaxLayer classificationLayer]; % 设置训练选项 options = trainingOptions('adam', ... 'MaxEpochs',10, ... 'MiniBatchSize',32, ... 'ValidationData',{valSequence,valLabels}, ... 'ValidationFrequency',20, ... 'Verbose',false); % 训练模型 net = trainNetwork(sequence,labels,layers,options); % 预测 testSequence = normalize(testSequence); % 归一化处理测试集 predictedLabels = classify(net,testSequence); % 评估模型准确率 accuracy = sum(predictedLabels == testLabels) / numel(testLabels); disp(['准确率:' num2str(accuracy)]); ``` 需要注意的是,该代码中的数据假设已经保存在名为`data.mat`的文件中,且数据应为一个矩阵`sequence`,每一行表示一个时序样本,每一列表示一个特征;另外一个向量`labels`存储对应的标签。在实际应用中,代码需要根据具体数据格式进行调整。训练选项、网络结构以及训练过程也可以根据实际需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 32
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

PlatinumA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值