data=xlsread('data_load'); % 按时间排序 load_data = sortrows(data, 1); % 生成训练集和测试集 train_ratio = 0.8; train_size = floor(train_ratio * size(load_data, 1)); train_data = load_data(1:train_size, 2:end); test_data = load_data(train_size+1:end, 2:end); % 数据归一化 train_data_norm = normalize(train_data); test_data_norm = normalize(test_data); % 准备训练数据 X_train = []; Y_train = []; n_steps = 3; % 每个时间步长包含的数据点数 for i = n_steps:size(train_data_norm, 1) X_train = [X_train; train_data_norm(i-n_steps+1:i, :)]; Y_train = [Y_train; train_data_norm(i, :)]; end % 调整训练数据的形状 X_train = permute(reshape(X_train', [], n_steps, size(X_train,1)), [3, 2, 1]); Y_train = permute(reshape(Y_train', [], n_steps, size(Y_train,1)), [3, 2, 1]); % 构建LSTM模型 input_size = size(train_data,2)-1; output_size = size(train_data,2)-1; num_hidden_units = 64; layers = [ ... sequenceInputLayer(input_size) lstmLayer(num_hidden_units,'OutputMode','last') fullyConnectedLayer(output_size) regressionLayer]; % 训练模型 opts = trainingOptions('adam', ... 'MaxEpochs',50, ... 'GradientThreshold',1, ... 'InitialLearnRate',0.01, ... 'LearnRateSchedule','piecewise', ... 'LearnRateDropFactor',0.1, ... 'LearnRateDropPeriod',30, ... 'Verbose',0, ... 'Plots','training-progress'); trained_net = trainNetwork(X_train, Y_train, layers, opts); % 准备测试数据 X_test = []; Y_test = []; for i = n_steps:size(test_data_norm, 1) X_test = [X_test; test_data_norm(i-n_steps+1:i, :)]; Y_test = [Y_test; test_data_norm(i, :)]; end % 调整测试数据的形状 X_test = reshape(X_test, [size(X_test,1), n_steps, size(test_data,2)-1]); Y_test = reshape(Y_test, [size(Y_test,1), size(test_data,2)-1]); % 进行预测 Y_pred = predict(trained_net, X_test); % 反归一化预测结果 Y_pred = Y_pred .* max(train_data) + min(train_data); Y_test = Y_test .* max(train_data) + min(train_data); % 绘制预测结果 figure plot(Y_test(:,1), 'b') hold on plot(Y_pred(:,1), 'r') legend('真实值', '预测值') title('负荷预测结果') xlabel('时间步长') ylabel('负荷值')
时间: 2023-12-24 22:11:22 浏览: 82
根据您提供的代码,出错的原因是您的输入数据的特征维度为 51,但是您的模型的输入层需要的特征维度为 2。这是因为您在将数据转换为训练数据时,使用了所有特征。您需要仅选择前两个特征作为输入,即时间和负荷值。您可以在以下代码中对 `train_data_norm` 进行修改,以仅选择前两个特征作为输入:
```
% 准备训练数据
X_train = [];
Y_train = [];
n_steps = 3; % 每个时间步长包含的数据点数
for i = n_steps:size(train_data_norm, 1)
X_train = [X_train; train_data_norm(i-n_steps+1:i, 1:2)]; % 只选择前两个特征作为输入
Y_train = [Y_train; train_data_norm(i, 1:2)];
end
```
这样可以确保您的输入数据的特征维度为 2,与您的模型的输入层所需的特征维度相匹配。
相关问题
% 导入数据 data_load=xlsread('data_load'); % 划分训练集和测试集 train_ratio = 0.8; % 训练集所占比例 train_size = round(size(data_load,1)*train_ratio); train_data = data_load(1:train_size,:); test_data = data_load(train_size+1:end,:); % 数据归一化 [train_data,train_settings] = mapminmax(train_data'); train_data = train_data'; test_data = mapminmax('apply',test_data',train_settings)'; test_data = test_data'; % 构造训练集和测试集的输入和输出 input_train = train_data(1:end-1,:); output_train = train_data(2:end,:); input_test = test_data(1:end-1,:); output_test = test_data(2:end,:);。 后面怎么进行lstm负荷预测
构造好训练集和测试集的输入和输出之后,接下来可以开始构建LSTM模型进行负荷预测。首先需要使用MATLAB中的`lstmLayer`函数创建一个LSTM层对象,然后使用`sequenceInputLayer`和`sequenceOutputLayer`函数创建输入和输出层对象。接着将这些层对象传入`layerGraph`函数中构建网络结构,最后使用`trainNetwork`函数进行训练。下面是一个简单的LSTM网络代码示例:
```matlab
numFeatures = size(input_train,2); % 特征数
numResponses = size(output_train,2); % 输出数
numHiddenUnits = 100; % 隐藏层神经元数
layers = [ ...
sequenceInputLayer(numFeatures)
lstmLayer(numHiddenUnits,'OutputMode','last')
fullyConnectedLayer(numResponses)
regressionLayer];
options = trainingOptions('adam', ...
'MaxEpochs',100, ...
'GradientThreshold',1, ...
'InitialLearnRate',0.01, ...
'LearnRateSchedule','piecewise', ...
'LearnRateDropFactor',0.1, ...
'LearnRateDropPeriod',20, ...
'MiniBatchSize',64, ...
'SequenceLength','longest', ...
'Shuffle','never', ...
'ValidationData',{input_test,output_test}, ...
'ValidationFrequency',10, ...
'Plots','training-progress');
net = trainNetwork(input_train',output_train',layers,options);
```
在训练完成后,可以使用`predict`函数对测试集数据进行预测:
```matlab
YPred = predict(net,input_test')';
```
最后,可以使用`mapminmax`函数将预测结果进行反归一化,以得到真实的负荷预测值。
優化這段 [SN SN SN_1]=xlsread(str_time,'Signal1'); [SN SN SN_2]=xlsread(str_time,'Signal2'); [SN SN SN_3]=xlsread(str_time,'Signal3'); save_data_1=[SN_1 ;result_summary_1]; xlswrite(str_time,save_data_1,'Signal1'); save_data_2=[SN_2;result_summary_2]; xlswrite(str_time,save_data_2,'Signal2'); save_data_3=[ SN_3;result_summary_3]; xlswrite(str_time,save_data_3,'Signal3');
以下是对代码的一些优化建议:
1. 将变量名命名得更加简洁易懂,便于阅读和维护代码。
2. 可以使用 `readtable` 函数来读取 Excel 文件,然后将表格数据存储在一个表格变量中,这样可以避免出现多个同名变量的问题。
3. 将 `SN_1`、`SN_2` 和 `SN_3` 合并为一个 `cell` 数组,然后使用 `cat` 函数来将这个 `cell` 数组和 `result_summary` 合并,可以简化代码并提高代码的执行效率。
4. 将 `xlswrite` 函数替换为更快的 `writetable` 函数,可以提高代码的执行速度。
综合以上建议,下面是优化后的代码:
```
% 读取 Excel 文件中的数据
data = readtable(str_time, 'Sheet', ["Signal1", "Signal2", "Signal3"]);
% 将结果存储到 cell 数组中
save_data = cell(1, 3);
for i = 1:3
SN = data{:, i};
save_data{i} = cat(1, SN, result_summary{i});
end
% 写入 Excel 文件
for i = 1:3
sheet_name = sprintf('Signal%d', i);
writetable(cell2table(save_data{i}), str_time, 'Sheet', sheet_name);
end
```
希望这些优化建议可以帮助到您的代码。
阅读全文