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));
LSTM,MATLAB
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
3条回答 默认 最新
关注 引自免费微信小程序:皆我百晓生
从你提供的MATLAB代码来看,你正在尝试使用LSTM(长短时记忆)网络对电池的SOC(荷电状态)进行预测。代码中包含了数据加载、预处理、模型定义、训练以及预测评估等步骤。不过,代码中存在一些潜在的问题和改进空间。下面,我将针对这些部分提供详细的指导和修正建议。
1. 数据加载与预处理
你的数据加载方式是正确的,但是预处理部分可能需要进一步优化。特别是,你对输出数据
T_train
和T_test
也进行了标准化处理,这通常只适用于输入数据。对于输出数据,我们通常不进行同样的预处理,除非它们的范围非常大或者分布极不均匀。修改建议:
- 只对输入数据
P_train
和P_test
进行标准化处理。 - 不要对输出数据
T_train
和T_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网络。如果你在执行过程中遇到任何具体问题,欢迎继续提问。
解决 无用评论 打赏 举报 编辑记录- 只对输入数据
悬赏问题
- ¥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 微信的店铺小程序如何修改背景图