【LSTM多输入多输出解决数据回归预测问题matlab】

文章介绍了LSTM网络的基本原理和其在处理序列数据的优势,特别是在时间序列分析中的应用。然后,通过Matlab代码展示了如何对具有三个特征和两个输出的3505样本数据集进行LSTM模型的训练、测试,包括数据预处理、模型构建、训练参数设置、预测及性能评估(如RMSE、R2、MAE和MBE)。
摘要由CSDN通过智能技术生成


引言

长短期记忆网络(Long Short-Term Memory,简称 LSTM)是一种递归神经网络(Recurrent Neural Network,简称 RNN)的变体,它在处理序列数据时表现出色,并且被广泛应用于时间序列分析、自然语言处理和语音识别等领域。

数据集res为3505的数值矩阵,有三个特征值,二个输出

LSTM 简介

LSTM 是一种特殊的 RNN,它通过引入门控机制来解决传统 RNN 的长期依赖问题。LSTM 的核心思想是在每个时间步上维护一个细胞状态(cell state),并通过输入门、遗忘门和输出门等门控单元来控制细胞状态的信息流动。

  1. 输入门(input gate):决定当前时间步的输入信息对细胞状态的影响程度。
  2. 遗忘门(forgetgate):决定上一个时间步的细胞状态对当前时间步的影响程度。
  3. 细胞状态(cell state):用于在不同时间步之间传递和存储信息。
  4. 输出门(output gate):决定细胞状态对当前时间步的输出影响程度。
  5. 隐藏状态(hiddenstate):当前时间步的输出,也是下一个时间步的输入。

LSTM 通过这些门控单元的组合和调整,能够有效地处理长序列数据,并捕捉序列中的长期依赖关系。具体门的数学公式网上有,此处只讲应用。

LSTM多输入多输出matlab实现

%%  划分训练集和测试集
temp = randperm(350);

P_train = res(temp(1: 200), 1: 3)';
T_train = res(temp(1: 200), 4: 5)';
M = size(P_train, 2);

P_test = res(temp(201: end), 1: 3)';
T_test = res(temp(201: end), 4: 5)';
N = size(P_test, 2);

%%  数据归一化
[P_train, ps_input] = mapminmax(P_train, 0, 1);
P_test = mapminmax('apply', P_test, ps_input);

[t_train, ps_output] = mapminmax(T_train, 0, 1);
t_test = mapminmax('apply', T_test, ps_output);

%%  数据平铺
P_train =  double(reshape(P_train, 3, 1, 1, M));
P_test  =  double(reshape(P_test , 3, 1, 1, N));

t_train = t_train';
t_test  = t_test' ;

%%  数据格式转换
for i = 1 : M
    p_train{i, 1} = P_train(:, :, 1, i);
end

for i = 1 : N
    p_test{i, 1}  = P_test( :, :, 1, i);
end

%%  创建模型
layers = [
    sequenceInputLayer(3)               % 建立输入层
    
    lstmLayer(64, 'OutputMode', 'last')  % LSTM层
    reluLayer                           % Relu激活层
    dropoutLayer(0.2) % 添加 Dropout 层,丢弃概率为 0.2

    lstmLayer(64, 'OutputMode', 'last')  % LSTM层
    reluLayer                           % Relu激活层
    dropoutLayer(0.2) % 添加 Dropout 层,丢弃概率为 0.2

   

    fullyConnectedLayer(2)              % 全连接层
    regressionLayer];                   % 回归层
 
%%  参数设置
options = trainingOptions('adam', ...      % Adam 梯度下降算法
    'MiniBatchSize', 30, ...               % 批大小
    'MaxEpochs', 1200, ...                 % 最大迭代次数
    'InitialLearnRate', 1e-2, ...          % 初始学习率为
    'LearnRateSchedule', 'piecewise', ...  % 学习率下降
    'LearnRateDropFactor', 0.5, ...        % 学习率下降因子
    'LearnRateDropPeriod', 800, ...        % 经过 800 次训练后 学习率为 0.01 * 0.5
    'Shuffle', 'every-epoch', ...          % 每次训练打乱数据集
    'Plots', 'training-progress', ...      % 画出曲线
    'Verbose', false);

%%  训练模型
net = trainNetwork(p_train, t_train, layers, options);

%%  仿真预测
t_sim1 = predict(net, p_train);
t_sim2 = predict(net, p_test );

%%  查看网络结构
analyzeNetwork(net)

%%  数据反归一化
T_sim1 = mapminmax('reverse', t_sim1', ps_output)';
T_sim2 = mapminmax('reverse', t_sim2', ps_output)';

for i = 1: 2
%%  均方根误差
error1(i, :) = sqrt(sum((T_sim1(:,i)' - T_train(i,:)).^2) ./ M);
error2(i, :) = sqrt(sum((T_sim2(:,i)' - T_test(i,:) ).^2) ./ N);

%%  绘图

figure
subplot(2, 1, 1)
plot(1: M, T_train(i,:), 'r-*', 1: M, T_sim1(:,i), 'b-o', 'LineWidth', 1)
legend('True value', 'Predicted value')
xlabel('Predict the sample')
ylabel('Predict the outcome')
string = {'Comparison of training set prediction results'; ['RMSE=' num2str(error1(i,:))]};
title(string)
xlim([1, M])
grid

subplot(2, 1, 2)
plot(1: N, T_test(i,:), 'r-*', 1: N, T_sim2(:,i), 'b-o', 'LineWidth', 1)
legend('True value', 'Predicted value')
xlabel('Predict the sample')
ylabel('Predict the outcome')
string = {'Comparison of test set prediction results'; ['RMSE=' num2str(error2(i,:))]};
title(string)
xlim([1, N])
grid

%%  分割线
disp('**************************')
disp(['下列是输出', num2str(i)])
disp('**************************')

%%  相关指标计算
%  R2
R1(i,:) = 1 - norm(T_train(i,:) - T_sim1(:,i)')^2 / norm(T_train(i,:) - mean(T_train(i,:)))^2;
R2(i,:) = 1 - norm(T_test(i,:)  - T_sim2(:,i)')^2 / norm(T_test(i,:)  - mean(T_test(i,:) ))^2;

disp(['The R2 of the training set data is:', num2str(R1(i,:))])
disp(['The R2 of the test set data is:', num2str(R2(i,:))])

%  MAE
mae1(i,:) = sum(abs(T_sim1(:,i)' - T_train(i,:))) ./ M ;
mae2(i,:)= sum(abs(T_sim2(:,i)' - T_test(i,:) )) ./ N ;

disp(['The MAE of the training set data is:', num2str(mae1(i,:))])
disp(['The MAE of the test set data is:', num2str(mae2(i,:))])

%  MBE
mbe1(i,:) = sum(T_sim1(:,i)' - T_train(i,:)) ./ M ;
mbe2(i,:) = sum(T_sim2(:,i)' - T_test(i,:)) ./ N ;

disp(['The MBE of the training set data is:', num2str(mbe1(i,:))])
disp(['The MBE of the test set data is:', num2str(mbe2(i,:))])

end

训练结果图
相关评价指标,想看其余的指标可自行添加

有几种方法可以使用MATLAB实现输入单输出的LSTM回归预测模型。其中,引用[1]和引用提供了完整的源码和数据,分别使用了LSTM和CNN-LSTM的结构。 对于LSTM模型的实现,可以使用MATLAB的深度学习工具箱。在这个模型中,输入个特征,输出是一个变量。模型的结构包括一个或LSTM层,用于捕捉时间序列中的长期依赖关系。可以通过训练模型来学习输入特征与输出变量之间的关系,并用模型进行预测。完整的源码和数据可以在引用中找到。 另一种方法是使用CNN-LSTM模型来实现输入单输出的回归预测。这种模型结合了卷积神经网络和LSTM网络的优点,能够同时捕捉空间特征和时间序列的依赖关系。同样,可以使用MATLAB的深度学习工具箱来实现这个模型。引用提供了完整的源码和数据,可以参考其中的实现思路。 总结来说,如果你想使用MATLAB实现输入单输出的LSTM回归预测模型,可以参考引用和引用提供的完整源码和数据。其中,引用使用了LSTM结构,而引用使用了CNN-LSTM结构。这些源码和数据可以帮助你理解如何在MATLAB中构建和训练这些模型,并用于输入单输出的回归预测任务。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [回归预测 | MATLAB实现LSTM(长短期记忆神经网络)输入单输出(完整源码和数据)](https://download.csdn.net/download/kjm13182345320/85476914)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [回归预测 | MATLAB实现CNN-LSTM输入单输出(完整源码和数据)](https://download.csdn.net/download/kjm13182345320/85288474)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [MATLAB实现LSTM长短期记忆神经网络输入单输出回归预测(完整源码和数据)](https://download.csdn.net/download/kjm13182345320/87241022)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

武帝为此

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

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

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

打赏作者

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

抵扣说明:

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

余额充值