LSTM时间序列预测MATLAB代码模板(无需调试)

多序列:http://t.csdn.cn/yfjoh

数据在评论区,导入自己的数据即可预测并画图

%% 1.环境清理
clear, clc, close all;
%% 2.导入数据,单序列
D=readmatrix('B.xlsx');
data=D(:,2);%要求行向量
data1=data;
% 原始数据绘图
figure
plot(data,'-s','Color',[0 0 255]./255,'linewidth',1,'Markersize',5,'MarkerFaceColor',[0 0 255]./255)
legend('原始数据','Location','NorthWest','FontName','华文宋体');
xlabel('样本','fontsize',12,'FontName','华文宋体');
ylabel('数值','fontsize',12,'FontName','华文宋体');
%% 3.数据处理
nn=1500;%训练数据集大小
numTimeStepsTrain = floor(nn);%nn数据训练 ,N-nn个用来验证
[XTrain,YTrain,XTest,YTest,mu,sig] = shujuchuli(data,numTimeStepsTrain);
%% 4.定义LSTM结构参数
numFeatures= 1;%输入节点
numResponses = 1;%输出节点
numHiddenUnits = 500;%隐含层神经元节点数 

%构建 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);
for i = 1:M
    [net,YPred_1(:,i)] = predictAndUpdateState(net,XTrain(:,i),'ExecutionEnvironment','cpu');%
end
T_sim1 = sig*YPred_1 + mu;%预测结果去标准化 ,恢复原来的数量级 
%% 9.仿真预测(验证集) 
N = numel(XTest);
for i = 1:N
    [net,YPred_2(:,i)] = predictAndUpdateState(net,XTest(:,i),'ExecutionEnvironment','cpu');%
end
T_sim2 = sig*YPred_2 + mu;%预测结果去标准化 ,恢复原来的数量级 
%% 10.评价指标
%  均方根误差
T_train=data1(1:M)';
T_test=data1(M+1: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.预测未来
P = N-nn;% 预测未来数量
YPred_3 = [];%预测结果清零 
[T_sim3] = yuceweilai(net,XTrain,data,P,YPred_3,sig,mu)

%%  13.绘图
figure
plot(1:size(data,1),data,'-s','Color',[255 0 0]./255,'linewidth',1,'Markersize',5,'MarkerFaceColor',[250 0 0]./255)
hold on 
%plot(size(data,1)+1:size(data,1)+P,T_sim3,'-o','Color',[150 150 150]./255,'linewidth',0.8,'Markersize',4,'MarkerFaceColor',[150 150 150]./255)
legend( 'LSTM预测结果','Location','NorthWest');
title('LSTM模型预测结果','fontsize',12)
xlabel('样本','fontsize',12);
ylabel('数值','fontsize',12);

上面代码中对应的function函数:

shujuchuli.m

function [XTrain,YTrain,XTest,YTest,mu,sig] = shujuchuli(data,numTimeStepsTrain)
dataTrain = data(1:numTimeStepsTrain+1,:);% 训练样本
dataTest = data(numTimeStepsTrain:end,:); %验证样本 
%训练数据标准化处理 
mu = mean(dataTrain,'ALL');
sig = std(dataTrain,0,'ALL');
dataTrainStandardized = (dataTrain - mu) / sig;
XTrain = dataTrainStandardized(1:end-1,:);% 训练输入 
YTrain = dataTrainStandardized(2:end,:);% 训练输出
%测试样本标准化处理 
dataTestStandardized = (dataTest - mu) / sig;
XTest = dataTestStandardized(1:end-1,:)%测试输入 
YTest = dataTest(2:end,:);%测试输出 

XTest=XTest';
YTest=YTest';
end

yuceweilai.m

function [T_sim3] = yuceweilai(net,XTrain,data,P,YPred_3,sig,mu)
net1 = resetState(net);
net1 = predictAndUpdateState(net1,XTrain);
[net1,YPred_3] = predictAndUpdateState(net1,data(end));
for i = 2:P
    [net1,YPred_3(:,i)] = predictAndUpdateState(net1,YPred_3(:,i-1),'ExecutionEnvironment','cpu');
end
T_sim3 = sig*YPred_3 + mu;
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');

 

运行结果:f97c1fd0b6aa4ca7bc0e91c8ef957717.bmp

943ebf74e1204a08ba2e1662662199d6.bmp

 

 

  • 47
    点赞
  • 393
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 59
    评论
### 回答1: CNN-LSTM是一种结合卷积神经网络和长短时记忆网络的模型,用于时间序列预测。在MATLAB中,可以通过代码实现CNN-LSTM模型进行时间序列预测。 首先,需要准备训练数据和测试数据。训练数据应该是已知的时间序列数据,而测试数据则是需要进行预测的数据。这两组数据应该分别存储在不同的文件中。 接着,导入MATLAB中的Deep Learning Toolbox工具包,使用其中的CNN和LSTM函数实现CNN-LSTM模型。可以根据实际需求选择不同的参数进行配置,比如CNN中卷积核的大小和数量、LSTM中记忆单元的数量等。然后将训练数据和测试数据分别输入CNN-LSTM模型进行训练和预测。 在训练过程中,可以通过迭代次数和训练误差来监控CNN-LSTM模型的表现。在预测过程中,可以将预测结果和真实结果进行比较,评估模型的准确性。 总之,通过MATLAB中的代码实现CNN-LSTM时间序列预测,可以方便地对时间序列数据进行预测,为实际应用中的决策提供支持。 ### 回答2: CNN-LSTM模型是一种用于时序预测的深度神经网络。它结合了卷积神经网络(CNN)和长短期记忆网络(LSTM),可以用于处理带有时间序列数据的复杂预测任务。 下面是基于MATLAB实现CNN-LSTM时间序列预测代码: 1.数据准备: load traffic_data.mat train_data = traffic(train_ind,:); test_data = traffic(test_ind,:); train_x = train_data(:,1:end-1); %训练样本 train_y = train_data(:,end); %训练标签 test_x = test_data(:,1:end-1); %测试样本 test_y = test_data(:,end); %测试标签 train_x = reshape(train_x,[size(train_x,1),24,21]); %输入数据转换为3D数组 test_x = reshape(test_x,[size(test_x,1),24,21]); 2.设置CNN-LSTM网络: input_size = [24,21,1]; layers = [ ... sequenceInputLayer(input_size) convolution2dLayer([3,3],6,'Padding','same') maxPooling2dLayer([2,2],'Stride',2) reluLayer convolution2dLayer([3,3],12,'Padding','same') maxPooling2dLayer([2,2],'Stride',2) lstmLayer(64,'OutputMode','sequence') fullyConnectedLayer(1) regressionLayer]; 3.训练和测试: options = trainingOptions('adam', ... 'MaxEpochs',100, ... 'MiniBatchSize',64, ... 'GradientThreshold',1, ... 'InitialLearnRate',0.01, ... 'LearnRateSchedule','piecewise', ... 'LearnRateDropFactor',0.2, ... 'LearnRateDropPeriod',50, ... 'Verbose',0, ... 'Plots','training-progress'); net = trainNetwork(train_x,train_y,layers,options); %训练网络 ypred = predict(net,test_x); %测试网络 4.评估模型表现: MSE = mean((test_y-ypred).^2); %均方误差 RMSE = sqrt(MSE); %均方根误差 R = corrcoef(test_y,ypred); %相关系数 R = R(1,2); 通过以上步骤,我们可以实现CNN-LSTM时间序列预测,并对模型表现进行评估。值得注意的是,该模型仅作为示例代码,实际应用中可能需要进行更多的调参和优化才能获得更好的效果。 ### 回答3: cnn-lstm 时间序列预测是一种利用深度学习模型进行时间序列预测的方法,它结合了卷积神经网络(CNN)和长短时记忆网络(LSTM)的优势,可以有效地处理时间序列数据中的长期依赖和非线性关系。 Matlab是一种功能强大的数学软件,它可以方便地实现cnn-lstm模型,并且提供了许多用于时间序列预测的工具和函数。 下面是cnn-lstm时间序列预测matlab代码实现步骤: 1. 数据预处理:通过matlab中的数据处理工具将时间序列数据进行归一化、平滑处理等,以便更好地适应模型的训练和预测过程。 2. 构建模型:利用matlab中的深度学习工具箱,构建cnn-lstm模型。其中,卷积层用于提取数据的特征,LSTM层用于在时间序列数据中捕获长期依赖关系。 3. 模型训练:将预处理好的数据输入到模型中,利用matlab中的SGD算法进行模型训练,调整模型的参数,使其最大化预测准确率。 4. 预测结果:模型训练完成后,将测试数据输入到模型中进行预测,得到时间序列的预测结果。可以通过matlab中的绘图工具将预测结果与真实值进行比较,评估模型的预测效果。 总结来说,利用matlab实现cnn-lstm时间序列预测,可以大大简化模型的搭建和训练过程,减少繁琐的代码编写。但是需要注意的是,模型的参数选择和数据预处理对于预测效果有很大的影响,在实际应用中需要进行多次试验和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

PlatinumA

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

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

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

打赏作者

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

抵扣说明:

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

余额充值