qq_66485113 2024-06-12 17:40 采纳率: 0%
浏览 2

LSTM,MATLAB


warning off
close all
clear
clc

% 加载数据
% filename = '25PLUSEHPPC.xlsx';
data = xlsread('25PLUSEHPPC.xlsx');



%%划分训练集和测试集
temp=1:1:102800;
P_train=data(temp(1:83980),1:4)';        %前80行前7列训练集输入
T_train=data(temp(1:83980),5)';          %前80行前8列训练集输出
M=size(P_train,2);  %训练集样本数目

P_test=data(temp(83981:end),1:4)';
T_test=data(temp(83981:end),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 =categorical(T_train)';
%  t_test =categorical(T_test)';

%数据标准化处理
mu = mean(P_train, 2); %计算均值
sigma = std(T_train, 0, 2);%计算标准差
% 防止出现标准差为零的情况
sigma(sigma == 0) = 1e-6;

P_train = (P_train - mu) ./ sigma;
P_test= (P_test - mu) ./ sigma;


% 将数据调整为 LSTM 网络所需的格式 [numTimeSteps, numFeatures, numSamples]
numTimeSteps = 1; % 假设每个样本只有一个时间步
numFeatures = 4;
P_train = reshape(P_train, [numTimeSteps, numFeatures, M]);
P_test = reshape(P_test, [numTimeSteps, numFeatures, N]);
T_train = reshape(T_train, [1,1, M]);
T_test = reshape(T_test, [1,1,N]);

% % 转置数据以符合LSTM格式
% P_train = permute(P_train, [2, 1, 3]); % 调整为 [1, 4, M]
% P_test = permute(P_test, [2, 1, 3]); % 调整为 [1, 4, N]
% % T_train = permute(T_train, [2, 1, 3]); % 调整为 [1, 1, M]
% % T_test = permute(T_test, [2, 1, 3]); % 调整为 [1, 1, N]



% 定义LSTM网络架构
inputSize = numFeatures; % 输入特征的数量
numHiddenUnits =100; % LSTM层中的隐藏单元数量
outputSize = 1 ;% 输出特征数量(电池SOC)



% % 数据格式转换
% 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(inputSize) %建立输入层 4个特征
     lstmLayer(100, 'OutputMode', 'last') %last只需要一个输出
     fullyConnectedLayer(outputSize) %输出只有一个值SOC
     regressionLayer];

% 指定训练选项
options = trainingOptions('adam', ...
    'MiniBatchSize',128, ...%批大小'
    'MaxEpochs', 100, ...%最大迭代轮数
    'InitialLearnRate', 0.005, ...%初始学习率
    'LearnRateSchedule','piecewise', ...    %学习率下降
    'LearnRateDropPeriod',500, ...      %经过500次训练后学习率0.005*0.5
    'LearnRateDropFactor',0.5, ...     %学习率下降因子
    'GradientThreshold', 1, ... 
    'Shuffle', 'never', ...
    'ValidationFrequency', floor(M / 128), ...
    'Verbose', 1, ...
    'Plots', 'training-progress');

% 训练LSTM网络
net = trainNetwork(P_train, T_train, layers, options);


% 仿真预测
Ypread=predict(net,P_test);


%计算mae
rmse = sqrt(mean((YPred -T_test).^2));
mae = mean(abs(YPred - T_test));

% 显示结果  
disp(['Test RMSE: ', num2str(rmse)]);
disp(['Test MAE: ', num2str(mae)]);

% 绘制实际值和预测值的对比图
figure;
plot(YTest, 'b');
hold on;
plot(YPred, 'r--');
legend('Actual SOC', 'Predicted SOC');
xlabel('Time Step');
ylabel('SOC');
title('Battery SOC Estimation');
hold off;

disp(size(P_train));
disp(size(P_test));
disp(size(T_train));
disp(size(T_test));
  • 写回答

3条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-06-12 17:40
    关注

    引自免费微信小程序:皆我百晓生

    从你提供的MATLAB代码来看,你正在尝试使用LSTM(长短时记忆)网络对电池的SOC(荷电状态)进行预测。代码中包含了数据加载、预处理、模型定义、训练以及预测评估等步骤。不过,代码中存在一些潜在的问题和改进空间。下面,我将针对这些部分提供详细的指导和修正建议。

    1. 数据加载与预处理

    你的数据加载方式是正确的,但是预处理部分可能需要进一步优化。特别是,你对输出数据T_trainT_test也进行了标准化处理,这通常只适用于输入数据。对于输出数据,我们通常不进行同样的预处理,除非它们的范围非常大或者分布极不均匀。

    修改建议:

    • 只对输入数据P_trainP_test进行标准化处理。
    • 不要对输出数据T_trainT_test进行相同的标准化处理。

    2. 数据格式调整

    你已经正确地将数据调整为适合LSTM网络的格式,但是注释掉的转置操作在MATLAB中是必要的,因为LSTM网络期望输入数据具有特定的维度顺序。

    修改建议:

    • 使用permute函数确保数据的维度正确无误。

    3. 网络架构

    你定义的LSTM网络结构看起来合理,但是可以考虑添加dropout层来防止过拟合,特别是在隐藏层之后。

    修改建议:

    • lstmLayer后面添加dropoutLayer

    4. 训练选项

    你选择的训练选项看起来是合理的,特别是'adam'优化器和学习率衰减策略。然而,考虑到LSTM网络可能需要更长的时间来收敛,你可能需要增加MaxEpochs的值。

    修改建议:

    • 考虑增加MaxEpochs到更高的值,比如200或更高,以允许网络有更多时间收敛。

    5. 预测与评估

    你的预测和评估方法是正确的,但是代码中预测值的变量名Ypread似乎是一个拼写错误,应该是YPred

    修改建议:

    • 确保预测值的变量名正确无误。

    修正后的代码示例

    以下是根据上述建议修正的部分代码片段:

    % 数据预处理
    mu = mean(P_train, 2);
    sigma = std(P_train, 0, 2);
    sigma(sigma == 0) = 1e-6;
    P_train = (P_train - mu) ./ sigma;
    P_test = (P_test - mu) ./ sigma;
    
    % 数据格式调整
    P_train = permute(P_train, [2, 1, 3]);
    P_test = permute(P_test, [2, 1, 3]);
    T_train = permute(T_train, [2, 1, 3]);
    T_test = permute(T_test, [2, 1, 3]);
    
    % 定义LSTM网络架构
    layers = [
        sequenceInputLayer(inputSize)
        lstmLayer(numHiddenUnits, 'OutputMode', 'last')
        dropoutLayer(0.5) % 添加dropout层
        fullyConnectedLayer(outputSize)
        regressionLayer];
    
    % 训练LSTM网络
    options.MaxEpochs = 200; % 增加最大迭代轮数
    net = trainNetwork(P_train, T_train, layers, options);
    
    % 仿真预测
    YPred = predict(net, P_test);
    
    % 计算mae
    rmse = sqrt(mean((YPred - T_test).^2));
    mae = mean(abs(YPred - T_test));
    

    以上修改应能帮助你更有效地训练和评估LSTM网络。如果你在执行过程中遇到任何具体问题,欢迎继续提问。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月12日

悬赏问题

  • ¥15 Windows Script Host 无法找到脚本文件"C:\ProgramData\Player800\Cotrl.vbs”
  • ¥15 matlab自定义损失函数
  • ¥15 35114 SVAC视频验签的问题
  • ¥15 impedancepy
  • ¥15 求往届大挑得奖作品(ppt…)
  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图