今天给大家分享DA优化CNN-LSTM的负荷预测,主要从算法原理和代码实战展开。需要了解更多算法代码的,可以点击文章左下角的阅读全文,进行获取哦~需要了解智能算法、机器学习、深度学习和信号处理相关理论的可以后台私信哦,下一期分享的内容就是你想了解的内容~
一、蜻蜓优化算法
蜻蜓优化算法( Dragonfly algorithm,DA)是Seyedali Mirjalili等于2016年提出的一种新型启发式智能算法。其主要灵感源于自然界中蜻蜓的静态和动态群集行为,具有寻优能力强等特点。其原理是模拟大自然中蜻蜓寻找猎物的行为。该算法源于自然中蜻蜓动态和静态的智能群行为,对蜻蜓的飞行线路、躲避天敌及寻找食物等生活习性进行数学建模。在动态群中,为获得更好的生存环境,大量的蜻蜓集群朝着共同的方向进行远距离迁徙;在静态群中,为寻找其他飞行猎物,由小部分蜻蜓组成的各个小组,在较小的范围内来回飞行。蜻蜓飞行过程中的局部运动与飞行路径的临时突变是静态群的主要特征。在自然界中,蜻蜓的生活习性可以归纳为5类行为方式:分离、排队、结盟、寻找猎物和躲避天敌。
在DA算法中对蜻蜓的各种行为作了如下定义:
1、分离
分离是每个蜻蜓个体与同类分开的行为,避免个体与周围其他个体间避免碰撞。分离行为的数学表达式为:
式中,Si 为不存在碰撞后的位置;X 为当前蜻蜓的位置;N 表示邻域内的个体数;Xj 为邻域内个体j 的位置。
2、对齐
对齐行为表示个体与邻域中其他个体的速度匹配。对齐行为的数学表达式为:
式中Vj 为邻域内个体j 的飞行速度。
3、聚集
聚集行为是指蜻蜓倾向于向群体中心聚集。聚集行为的数学表达式为:
4、捕食
蜻蜓形成小群体后,下一步就开始进行捕食:
式中X+为待趋近的目标位置。
5、避敌
在捕食过程中,蜻蜓肯定也会遇到自己的天敌,因此避敌过程描述为:
式中X-为天敌的位置。上述五种行为可由下图进行展示。
步向量表示为蜻蜓的飞行方向以及步长,其数学式如下:
式中,s、a、c、f、e、w 分别为分离权重、对齐权重、聚集权重、猎物权重、天敌权重、惯性权重。
在自然界中,出于生存需要,大部分时间蜻蜓都是运动的,因此所处位置也需实时更新。更新蜻蜓个体所处位置的向量,数学表达式如下:
要达到使算法性能进一步得到强化的目的,在同类个体附近无临近解时,通过使用levy飞行的方法绕搜索空间飞行,进行蜻蜓位置的更新:
式中,d代表维度,levy函数计算如下:
DA算法的伪代码如下:
本文利用DA优化算法优化CNN-LSTM模型的初始学习率、LSTM1、LSTM2的隐含层节点数,寻找CNN-LSTM模型最优初始学习率、LSTM1、和LSTM2的最优隐含层节点数的组合,得到最优模型。
二、CNN-LSTM
2.1 CNN原理
卷积神经网络具有局部连接、权值共享和空间相关等特性。卷积神经网络结构包含卷积层、激活层和池化层。
(a)二维卷积层将滑动卷积滤波器应用于输入。该层通过沿输入垂直和水平方向 移动滤波器对输入进行卷积,并计算权重与输入的点积,然后加入一个偏置项。具体表达式为:
卷积层的功能是对输入数据进行特征提取。其内部包含多个卷积核,也称为 感受野。将输入图像和卷积核做卷积运算,可以增强原始信号特征的同时降低噪声。卷积运算的具体过程如图1所示。
图1 卷积运算的具体过程
(2)激活函数
在卷积神经网络中,常用的激活函数包括 Sigmoid 函数、Tanh 函数、Swish 函数和 Relu 函数。Relu 函数解决了 Sigmoid 函数和 Tanh 函数梯度消失的问题, 提高了模型收敛的速度,受到的广泛学者的欢迎。
(3)池化层
池化层又称为下采样层,池化层分为平均池化层和最大池化层。其中,最大池化层通过将输入分为矩形池化区域,并计算每个区域的最大值来执行下采样, 而平均池化层则是计算池化区域的平均值来执行下采样。池化层的池化过程如图2所示。
图2 池化过程示意图
2.2 LSTM原理
LSTM采用循环神经网络( Recurrent Neural Network,RNN )架构,它是专门为从序列中学习长期依赖关系而设计的。LSTM可以使用4个组件:输入门、输出门、遗忘门和具有自循环连接的单元来移除或添加块状态的信息。其神经元结构如图3所示。
图3 LSTM网络结构
设输入序列共有 k 个时间步,LSTM 门控机制 结构为遗忘门、输入门和输出门,xt携带网络输入值 作为向量引入系统,ht 通过隐含层对 LSTM 细胞进 行输出,ct携带着 LSTM 细胞状态进行运算。LSTM 运算规则如下:
计算后保留 ct与 ht,用于下一时间步的计算;最后一步计算完成后,将隐藏层向量 hk作为输出与本组序列对应的预测值对比,得出损失函数值,依据梯度下降算法,优化权重和偏置参数,以此训练出迭代次数范围内最精确的网络参数。
2.3 CNN-LSTM框架
以时序预测为例,本次分享的CNN-LSTM的框架如图4所示。
图4 CNN-LSTM框架
3、代码实战
%% DA-CNN-LSTM负荷预测
% 数据集(列为特征,行为样本数目
clc
clear
load('Train.mat')
%
Train(1,:) =[];
y = Train.demand;
x = Train{:,3:end};
% LSTM 层设置,参数设置
inputSize = size(Train_xNorm{1},1); %数据输入x的特征维度
outputSize = 1; %数据输出y的维度
%%
%% 优化算法参数设置
SearchAgents_no = 40; % 数量
Max_iteration = 50; % 最大迭代次数
dim = 3; % 优化参数个数
lb = [1e-4,10,10]; % 参数取值下界(学习率,隐藏层节点,正则化系数)
ub = [1e-3, 200,200]; % 参数取值上界(学习率,隐藏层节点,正则化系数)
fit = @(x)fitness(x,inputSize,outputSize);
[Best_score,Best_pos,curve]=DA(SearchAgents_no,Max_iteration,lb ,ub,dim,fit)
best_lr = Best_pos(1); % 最佳隐藏层节点数
numhidden_units1 = round(Best_pos(2));% 最佳隐藏层节点数1
numhidden_units2 = round(Best_pos(3));% 最佳隐藏层节点数2
%% lstm
layers = [ ...
sequenceInputLayer([inputSize,1,1],'name','input') %输入层设置
sequenceFoldingLayer('name','fold')
convolution2dLayer([2,1],10,'Stride',[1,1],'name','conv1')
batchNormalizationLayer('name','batchnorm1')
reluLayer('name','relu1')
maxPooling2dLayer([1,3],'Stride',1,'Padding','same','name','maxpool')
sequenceUnfoldingLayer('name','unfold')
flattenLayer('name','flatten')
lstmLayer(numhidden_units1,'Outputmode','sequence','name','hidden1')
dropoutLayer(0.3,'name','dropout_1')
lstmLayer(numhidden_units2,'Outputmode','last','name','hidden2')
dropoutLayer(0.3,'name','drdiopout_2')
fullyConnectedLayer(outputSize,'name','fullconnect') % 全连接层设置(影响输出维度)(cell层出来的输出层) %
tanhLayer('name','softmax')
regressionLayer('name','output')];
lgraph = layerGraph(layers)
lgraph = connectLayers(lgraph,'fold/miniBatchSize','unfold/miniBatchSize');
% plot(lgraph)
%
% 网络训练
options = trainingOptions('adam', ...
'MaxEpochs',10, ...
'GradientThreshold',1,...
'ExecutionEnvironment','gpu',...
'InitialLearnRate',best_lr, ...
'LearnRateSchedule','piecewise', ...
'LearnRateDropPeriod',2, ... %2个epoch后学习率更新
'LearnRateDropFactor',0.5, ...
'Shuffle','once',... % 时间序列长度
'SequenceLength',k,...
'MiniBatchSize',24,...
'Plots', 'training-progress',... % 画出曲线
'Verbose',0);
%% 训练
[net,traininfo] = trainNetwork(Train_xNorm, Train_yNorm, lgraph, options);
%% 预测
t_sim1 = predict(net, Train_xNorm);
t_sim2 = predict(net, Test_xNorm);
%% 数据反归一化
T_sim1 = mapminmax('reverse', t_sim1',yopt);
T_sim2 = mapminmax('reverse', t_sim2', yopt);
T_sim1 = double(T_sim1) ;
T_sim2 = double(T_sim2) ;
%% 绘图
M = size(T_sim1,2);
N = size(T_sim2,2);
figure
plot(1 : length(curve), curve,'linewidth',1.5);
title('DA-CNN-LSTM', 'FontSize', 10);
xlabel('迭代次数', 'FontSize', 10);
ylabel('适应度值', 'FontSize', 10);
grid off
%% 均方根误差 RMSE
error1 = sqrt(sum((T_sim1 - Test_x').^2)./M);
error2 = sqrt(sum((Test_yNorm' - T_sim2).^2)./N);
%% 显示网络结构
analyzeNetwork(net)
%% 绘图
figure
plot(lgraph)
title("CNN-LSTM模型结构")
%% 绘图
figure
plot(T_sim1,'-','linewidth',1)
hold on
plot(Test_x,'-','linewidth',1)
legend( 'DA-CNN-LSTM拟合训练数据','实际分析数据','Location','NorthWest','FontName','华文宋体');
title('DA-CNN-LSTM模型预测结果及真实值','fontsize',12,'FontName','华文宋体')
xlabel('样本','fontsize',12,'FontName','华文宋体');
ylabel('数值','fontsize',12,'FontName','华文宋体');
xlim([1 M])
%-------------------------------------------------------------------------------------
figure
bar((T_sim1 - Test_x)./Test_x)
legend('DA-CNN-LSTM模型训练集相对误差','Location','NorthEast','FontName','华文宋体')
title('DA-CNN-LSTM模型训练集相对误差','fontsize',12,'FontName','华文宋体')
ylabel('误差','fontsize',12,'FontName','华文宋体')
xlabel('样本','fontsize',12,'FontName','华文宋体')
xlim([1 M]);
%-------------------------------------------------------------------------------------
figure
plot(T_sim2,'-','linewidth',1)
hold on
plot(Test_y,'-','linewidth',1)
legend('DA-CNN-LSTM预测测试数据','实际分析数据','Location','NorthWest','FontName','华文宋体');
title('DA-CNN-LSTM模型预测结果及真实值','fontsize',12,'FontName','华文宋体')
xlabel('样本','fontsize',12,'FontName','华文宋体');
ylabel('数值','fontsize',12,'FontName','华文宋体');
xlim([1 N])
%-------------------------------------------------------------------------------------
figure
bar((T_sim2 - Test_y )./Test_y')
legend('DA-CNN-LSTM模型测试集相对误差','Location','NorthEast','FontName','华文宋体')
title('DA-CNN-LSTM模型测试集相对误差','fontsize',12,'FontName','华文宋体')
ylabel('误差','fontsize',12,'FontName','华文宋体')
xlabel('样本','fontsize',12,'FontName','华文宋体')
xlim([1 N]);
%% 相关指标计算
% R2
R1 = 1 - norm(Test_x - T_sim1)^2 / norm(Test_x - mean(Test_x))^2;
R2 = 1 - norm(Test_y - T_sim2)^2 / norm(Test_y - mean(Test_y))^2;
disp(['训练集数据的R2为:', num2str(R1)])
disp(['测试集数据的R2为:', num2str(R2)])
% MAE
mae1 = sum(abs(T_sim1 - Test_x)) ./ M ;
mae2 = sum(abs(T_sim2 - Test_y )) ./ N ;
disp(['训练集数据的MAE为:', num2str(mae1)])
disp(['测试集数据的MAE为:', num2str(mae2)])
% MAPE
maep1 = sum(abs(T_sim1 - Test_x)./Test_x) ./ M ;
maep2 = sum(abs(T_sim2 - Test_y)./Test_y) ./ N ;
disp(['训练集数据的MAPE为:', num2str(maep1)])
disp(['测试集数据的MAPE为:', num2str(maep2)])
% RMSE
RMSE1 = sqrt(sumsqr(T_sim1 - Test_x)/M);
RMSE2 = sqrt(sumsqr(T_sim2 - Test_y)/N);
disp(['训练集数据的RMSE为:', num2str(RMSE1)])
disp(['测试集数据的RMSE为:', num2str(RMSE2)])
%% 保存训练模型
save ('model')
仿真结果
点击下方关注获取