基于LSTM-Adaboost的电力负荷预测,附MATLAB代码

今天为大家带来一期基于LSTM-Adaboost的电力负荷预测。代码中的LSTM可以替换为任意的机器学习算法。

原理详解

LSTM-AdaBoost负荷预测模型先通过 AdaBoost集成算法串行训练多个基学习器并计算每个基学习 器的权重系数,接着将各个基学习器的预测结果进行线性组合,生成最终的预测结果。

LSTM-AdaBoost模型算法流程如下:

da87859072ec36e341f6e8558d1144b7.png

80d29db4f84c95a761747cfc8a35b5ad.png

通过Adaboost算法便把许多个弱预测器集成为一个强预测器,最后通过强预测器对弱预测器的结果进行加权,得到最终结果。LSTM-Adaboost网络模型流程图如图所示:

c5b7d8d950787333887ba77d548033b5.png


内容详解

①对电力负荷数据进行处理

本次数据包含负荷值,温度,湿度,风速,压强,降水量,能见度,水汽压和体感温度,部分数据截图如下:

ad42a70dc86223ad9ccfb4b27a6bbf44.png

选取1200个样本作为训练集,每个样本组成为:当天24个小时的全部数据,因此训练集的输入数据大小为1200*216,其中216=24*9,24代表24个小时,9代表9个特征。训练集的输出数据大小为:1200*1。1代表未来一小时的负荷值。

选取200个样本作为测试集,同理,测试集的输入数据大小为200*216,训练集的输出数据大小为:200*1。

②采用LSTM-Adaboost对电力负荷数据进行训练和预测

LSTM的预测结果如下:

1c67d2c0a7c506cbfdba03337d6018d5.png

可以看到,未优化的LSTM的预测效果不是很理想,MSE指标为64.7033,误差较大!

LSTM-Adaboost模型的预测效果如下:(本次实验选用了10个LSTM弱分类器)

8fdf42246f1a7d1a6bb74dd24ff8c418.png

误差对比图如下:

b18879167506197cdc106b0f3fd8083e.png

可以看到LSTM-Adaboost预测效果有了明显提升,LSTM-Adaboost的MSE误差为26.6652,相比于之前的64.7033有了很大提升!

部分代码

clear
close all
clc
data =  readmatrix('data.csv');
data = data(:,2:10);
w=1;                  % w是滑动窗口的大小
s=24;                  % 选取前24小时的所有数据去预测未来一小时的数据
m = 1200;            %选取m个样本作训练集
n = 200;             %选取n个样本作测试集
input_train=[];    %选取1月1日-1月10日,1月2日-1月11日,1月3日-1月12日…………3月1日到3月10日的数据作为训练集的输入
for i =1:m
    xx = data(1+w*(i-1):w*(i-1)+s,:);
    xx =xx(:);
    input_train = [input_train,xx];
end
output_train =[];  %选取1月11日,1月12日,1月13日…………3月11日的数据作为训练集的输出
output_train = data(2:m+1,1)';


input_test=[];  %选取3月2日到3月11日的数据作为测试集的输入
for i =m+1:m+n
    xx = data(1+w*(i-1):w*(i-1)+s,:);
    xx =xx(:);
    input_test = [input_test,xx];
end
output_test = data(m+2:m+n+1,1)';


%% 数据归一化
[inputn,inputps]=mapminmax(input_train,0,1);
[outputn,outputps]=mapminmax(output_train);
inputn_test=mapminmax('apply',input_test,inputps);
%% 获取输入层节点、输出层节点个数
inputnum=size(input_train,1);
outputnum=size(output_train,1);
disp('/')
disp('LSTM神经网络结构...')
disp(['输入层的节点数为:',num2str(inputnum)])
disp(['输出层的节点数为:',num2str(outputnum)])


numFeatures = inputnum;   %特征为一维
numResponses = outputnum;  %输出也是一维
numHiddenUnits1 = 25;   %创建LSTM回归网络,指定LSTM层的隐含单元个数。可调
layers = [ ...
    sequenceInputLayer(numFeatures)    %输入层
    lstmLayer(numHiddenUnits1, 'OutputMode', 'sequence')
    fullyConnectedLayer(numResponses)    %为全连接层,是输出的维数。
    regressionLayer];      %其计算回归问题的半均方误差模块 。即说明这不是在进行分类问题。
 
%指定训练选项,求解器设置为adam, 1000轮训练。
%梯度阈值设置为 1。指定初始学习率 0.01,在 125 轮训练后通过乘以因子 0.2 来降低学习率。
options = trainingOptions('adam', ...
    'MaxEpochs',1000, ...
    'GradientThreshold', 1, ...
    'InitialLearnRate',0.01, ...      
    'LearnRateSchedule','piecewise', ...%每当经过一定数量的时期时,学习率就会乘以一个系数。
    'LearnRateDropFactor', 0.01, ...
    'LearnRateDropPeriod',600, ...      %乘法之间的纪元数由" LearnRateDropPeriod"控制。可调
    'Verbose',0,  ...  %如果将其设置为true,则有关训练进度的信息将被打印到命令窗口中。默认值为true。
    'Plots','training-progress');    %构建曲线图 将'training-progress'替换为none
net0 = trainNetwork(inputn,outputn,layers,options); 
an0 = predict(net0,inputn_test);  
%预测结果反归一化与误差计算
test_simu0=mapminmax('reverse',an0,outputps); %把仿真得到的数据还原为原始的数量级
%误差指标
error0 = output_test - test_simu0;
mse0=mse(output_test,test_simu0)
%% 标准LSTM神经网络作图
figure
plot(output_test,'b-','markerfacecolor',[0.5,0.5,0.9],'MarkerSize',6)
hold on
plot(test_simu0,'r--','MarkerSize',6)
title(['mse误差:',num2str(mse0)])
legend('真实y','预测的y')
xlabel('样本数')
ylabel('负荷值')

代码获取

完整代码获取,后台回复关键词:

LSTM

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 7
    评论
以下是使用LSTM-Attention模型进行时间序列预测的MATLAB代码: ``` % 加载数据 data = load('data.csv'); X = data(:, 1:end-1); Y = data(:, end); % 划分训练集和测试集 train_ratio = 0.8; num_train = floor(train_ratio * size(X, 1)); X_train = X(1:num_train, :); Y_train = Y(1:num_train, :); X_test = X(num_train+1:end, :); Y_test = Y(num_train+1:end, :); % 构建LSTM-Attention模型 num_features = size(X_train, 2); num_hidden = 32; num_attention = 16; input_layer = sequenceInputLayer(num_features, 'Name', 'input'); lstm_layer = lstmLayer(num_hidden, 'OutputMode', 'last', 'Name', 'lstm'); attention_layer = attentionLayer(num_attention, 'Name', 'attention'); fc_layer = fullyConnectedLayer(1, 'Name', 'fc'); output_layer = regressionLayer('Name', 'output'); layers = [input_layer lstm_layer attention_layer fc_layer output_layer]; % 设置训练选项 options = trainingOptions('adam', ... 'MaxEpochs', 100, ... 'MiniBatchSize', 32, ... 'GradientThreshold', 1, ... 'InitialLearnRate', 0.001, ... 'LearnRateSchedule', 'piecewise', ... 'LearnRateDropFactor', 0.1, ... 'LearnRateDropPeriod', 50, ... 'Shuffle', 'every-epoch', ... 'Verbose', 1, ... 'Plots', 'training-progress'); % 训练模型 net = trainNetwork(X_train', Y_train', layers, options); % 预测结果 Y_pred = predict(net, X_test'); mse = mean((Y_test - Y_pred').^2); fprintf('MSE: %.4f\n', mse); ``` 需要注意的是,此代码中使用了MATLAB Deep Learning Toolbox中的一些函数,如sequenceInputLayer、lstmLayer、attentionLayer等。如果你没有安装这些工具箱,需要先安装并添加到MATLAB路径中。此外,代码中也需要加载数据文件data.csv,如果你的数据格式不同,需要相应地修改代码

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

今天吃饺子

不想刀我的可以选择爱我

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

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

打赏作者

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

抵扣说明:

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

余额充值