瞿十六 2024-04-23 15:09 采纳率: 0%
浏览 12

LSTM回归预测代码修改

使用MATLAB进行LSTM回归预测,下面是我们的代码,但是一直有问题,改了半天也不知道要改哪里。

%%  清空环境变量
warning off             % 关闭报警信息
close all               % 关闭开启的图窗
clear                   % 清空变量
clc                     % 清空命令行

%%  导入数据
res = xlsread('数据集1.xlsx');

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

P_train = res(temp(1: 2000), 1: 6)';
T_train = res(temp(1: 2000), 7)';
M = size(P_train, 2);

P_test = res(temp(2001: end), 1: 6)';
T_test = res(temp(2001: end), 7)';
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, 6, 1, 1, M));
P_test  =  double(reshape(P_test , 6, 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(6)               % 建立输入层
    
    lstmLayer(4, 'OutputMode', 'last')  % LSTM层
    reluLayer                           % Relu激活层
    
    fullyConnectedLayer(1)              % 全连接层
    regressionLayer];                   % 回归层
 
%%  参数设置
options = trainingOptions('adam', ...      % Adam 梯度下降算法
    'MaxEpochs', 3000, ...                 % 最大迭代次数
    'InitialLearnRate', 0.01, ...          % 初始学习率为 0.01
    'LearnRateSchedule', 'piecewise', ...  % 学习率下降
    'LearnRateDropFactor', 0.1, ...        % 学习率下降因子
    'LearnRateDropPeriod', 1200, ...       % 经过 1200 次训练后 学习率为 0.01 * 0.1
    '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 );

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

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

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

%%  绘图
figure
plot(1: M, T_train, 'r-*', 1: M, T_sim1, 'b-o', 'LineWidth', 1)
legend('真实值', '预测值')
xlabel('预测样本')
ylabel('预测结果')
string = {'训练集预测结果对比'; ['RMSE=' num2str(error1)]};
title(string)
xlim([1, M])
grid

figure
plot(1: N, T_test, 'r-*', 1: N, T_sim2, 'b-o', 'LineWidth', 1)
legend('真实值', '预测值')
xlabel('预测样本')
ylabel('预测结果')
string = {'测试集预测结果对比'; ['RMSE=' num2str(error2)]};
title(string)
xlim([1, N])
grid

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

disp(['训练集数据的R2为:', num2str(R1)])
disp(['测试集数据的R2为:', num2str(R2)])

% 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)])

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

disp(['训练集数据的MBE为:', num2str(mbe1)])
disp(['测试集数据的MBE为:', num2str(mbe2)])

%%  绘制散点图
sz = 25;
c = 'b';

figure
scatter(T_train, T_sim1, sz, c)
hold on
plot(xlim, ylim, '--k')
xlabel('训练集真实值');
ylabel('训练集预测值');
xlim([min(T_train) max(T_train)])
ylim([min(T_sim1) max(T_sim1)])
title('训练集预测值 vs. 训练集真实值')

figure
scatter(T_test, T_sim2, sz, c)
hold on
plot(xlim, ylim, '--k')
xlabel('测试集真实值');
ylabel('测试集预测值');
xlim([min(T_test) max(T_test)])
ylim([min(T_sim2) max(T_sim2)])
title('测试集预测值 vs. 测试集真实值')

运行后就是出现这样的问题

img


请问这个代码怎么改进才能正常运行?

  • 写回答

7条回答 默认 最新

  • 码农阿豪@新空间代码工作室 Java领域优质创作者 2024-04-23 15:09
    关注
    让阿豪来帮你解答,本回答参考chatgpt3.5编写提供,如果还有疑问可以评论或留言
    问题:使用MATLAB进行LSTM回归预测,下面是我们的代码,但是一直有问题,改了半天也不知道要改哪里。 回答:
    1. 代码中有许多注释,但是注释内容都是使用中文标点符号,这在MATLAB中可能会导致解析错误,需要使用英文标点符号替换。
    2. 在导入数据res时,需要确认数据集1.xlsx文件是否存在,文件路径是否正确。
    3. 在输入层(sequenceInputLayer)的参数应该是6,而不是1。
    4. 在训练模型时,应该将P_train和t_train全部转换为gpuArray,否则训练过程可能会非常缓慢。代码如下:
    net = trainNetwork(gpuArray(p_train), gpuArray(t_train), layers, options);
    
    1. 在仿真预测时,应该先将P_test也转换为gpuArray,否则预测过程可能会非常缓慢。代码如下:
    t_sim2 = predict(net, gpuArray(p_test));
    
    1. 在绘图时,应该将T_sim1、T_sim2、T_train和T_test全部转换为CPU变量,否则可能会导致plot函数无法执行。代码如下:
    figure
    plot(1: M, gather(T_train), 'r-*', 1: M, gather(T_sim1), 'b-o', 'LineWidth', 1)
    legend('真实值', '预测值')
    xlabel('预测样本')
    ylabel('预测结果')
    string = {'训练集预测结果对比'; ['RMSE=' num2str(error1)]};
    title(string)
    xlim([1, M])
    grid
    figure
    plot(1: N, gather(T_test), 'r-*', 1: N, gather(T_sim2), 'b-o', 'LineWidth', 1)
    legend('真实值', '预测值')
    xlabel('预测样本')
    ylabel('预测结果')
    string = {'测试集预测结果对比'; ['RMSE=' num2str(error2)]};
    title(string)
    xlim([1, N])
    grid
    

    注:上述代码仅针对问题进行改进,不代表其他部分逻辑的正确性。

    评论

报告相同问题?

问题事件

  • 创建了问题 4月23日

悬赏问题

  • ¥15 苹果系统的mac m1芯片的笔记本使用ce修改器使用不了
  • ¥15 单相逆变的电压电流双闭环中进行低通滤波PID算法改进
  • ¥15 关于#java#的问题,请各位专家解答!
  • ¥15 如何卸载arcgis 10.1 data reviewer for desktop
  • ¥15 共享文件夹会话中为什么会有WORKGROUP
  • ¥15 关于#python#的问题:使用ATL02数据解算光子脚点的坐标(操作系统-windows)
  • ¥115 关于#python#的问题:未加密前两个软件都可以打开,加密后只有A软件可打开,B软件可以打开但读取不了数据
  • ¥15 在matlab中Application Compiler后的软件无法打开
  • ¥15 想问一下STM32创建工程模板时遇到得问题
  • ¥15 Fiddler抓包443