基于DA优化CNN-LSTM的负荷预测

  今天给大家分享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负荷预测% 数据集(列为特征,行为样本数目clcclearload('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));% 最佳隐藏层节点数1numhidden_units2 = round(Best_pos(3));% 最佳隐藏层节点数2%% lstmlayers = [ ...        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);figureplot(1 : length(curve), curve,'linewidth',1.5);title('DA-CNN-LSTM', 'FontSize', 10);xlabel('迭代次数', 'FontSize', 10);ylabel('适应度值', 'FontSize', 10);grid off%%  均方根误差 RMSEerror1 = sqrt(sum((T_sim1 - Test_x').^2)./M);error2 = sqrt(sum((Test_yNorm' - T_sim2).^2)./N);%%  显示网络结构analyzeNetwork(net)%%  绘图figureplot(lgraph)title("CNN-LSTM模型结构")%%  绘图figureplot(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])%-------------------------------------------------------------------------------------figurebar((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]);%-------------------------------------------------------------------------------------figureplot(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])%-------------------------------------------------------------------------------------figurebar((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]);%%  相关指标计算%  R2R1 = 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)])%  MAEmae1 = sum(abs(T_sim1 - Test_x)) ./ M ;mae2 = sum(abs(T_sim2 - Test_y )) ./ N ;disp(['训练集数据的MAE为:', num2str(mae1)])disp(['测试集数据的MAE为:', num2str(mae2)])%  MAPEmaep1 = 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)])%  RMSERMSE1 = 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')

仿真结果

点击下方关注获取

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/483011.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot+vue的电影院购票系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

docker将本地镜像pull到阿里云和registry

目录 一、上次到阿里云服务器 1、制作一个带有vim功能的Ubuntu镜像 2、在阿里云上面创建镜像仓库 3、从阿里云仓库中上传和拉取镜像 二、上传镜像到本地私有库registry 1、下载镜像docker registry 2、运行私有库registry,相当于本地有个私有docker hub。 3…

Unity:2D

目录 1. 简介 2. 2D Sorting 3. 9-slicing Sprites 3.1 9-slicing and Colliders 4. Sprite Renderer 5. Sprite Creator 6. Sprite Editor 6.1 Slice 6.1 Resize polygons 6.2 Custom Outline 6.3 Custom Physics Shape 6.4 Secondary Textures 6.5 Data Provider…

Nginx 全局块配置 user 指令详解

1. 前言 user 指令用于配置运行 nginx 服务器的 worker 进程的用户和用户组,这样对于系统权限的访问控制更加精细和安全 如果你修改过 nginx.conf,那么就会看到文件第一行的 user 指令配置,默认是被注释掉的(默认使用 nobody 用户…

《边缘计算:连接未来的智慧之桥》

随着物联网、5G等技术的快速发展,边缘计算作为一种新兴的计算模式,正逐渐引起人们的广泛关注。边缘计算通过将数据处理和存储功能放置在距离数据产生源头更近的位置,实现了更快速、更可靠的数据处理和交换,为各行各业带来了前所未…

镁光的sdram手册阅读--MT48LCC16M16A2

镁光的sdram手册阅读–MT48LCC16M16A2 一、这个sdram的总容量是256Mb,MT48LC16M16A2对应的参数是:4Meg 16 4banks,也可表示为16M16。4164256Mbit。 1)其中,4Meg表示单个bank包含的存储单元个数,计算公式…

架构整洁之道-读书总结

1 概述 1.1 关于本书 《架构整洁之道》(Clean Architecture: A Craftsman’s Guide to Software Structure and Design)是由著名的软件工程师Robert C. Martin(又称为Uncle Bob)所著。这本书提供了软件开发和架构设计的指导原则…

查看文件信息:ls,pwd,操作文件:cd,touch,mkdir,rmdir,rm,cp,mv

目录 ls 选项 -l -a 隐藏文件存在的意义 -F -d -R pwd cd 选项 ​编辑 touch 选项 mkdir 选项 -p rmdir 选项 -p rm 选项 cp 选项 -r -R (和-r的区别) mv 移动目录 改名 选项 rm改为mv ls 显示当前目录下的文件 选项 (可以合并使用,有的也可以写…

linux centos 安装jenkins,并构建spring boot项目

首先安装jenkins,使用war包安装,比较简单,注意看下载的版本需要的JDK版本,官网下载https://www.jenkins.io/download/ 把下载好的war包放到服务器上,然后运行,注意8080端口的放行 # 前台运行并指定端口 ja…

目标检测的指标评估

目标检测模型的评价指标主要用于衡量模型的性能,特别是它在定位和识别目标方面的准确性。以下是一些常见的评价指标: 1. 精确度 (Precision): 表示检测到的目标中,正确检测到的目标所占的比例。精确度高意味着模型产生的误报(错误…

rabbitmq 3.9.29 docker mac 管理员页面无法打开

SyntaxError: Unexpected token ‘catch’ SyntaxError: Unexpected token ‘catch’ at EJS.Compiler.compile (http://127.0.0.1:15672/js/ejs-1.0.min.js:1:6659) at new EJS (http://127.0.0.1:15672/js/ejs-1.0.min.js:1:1625) at format (http://127.0.0.1:15672/js/main…

图床项目实战:从零搭建一个简易图床

项目背景与需求分析 随着互联网的发展,图片分享、存储和管理的需求日益增长。图床作为一种专门用于存储和分享图片的服务,受到了广大用户的欢迎。本项目旨在搭建一个简易的图床系统,满足用户上传、查看和删除图片的基本需求。 技术选型 本项…

微光图像增强算法学习记录(一)

微光图像增强(LLIE)旨在恢复照明并提高微光图像的可见性,本文对阅读的文献进行记录和分享,帮助回顾和大家建立学习资料。 文献一摘要及前沿摘选主要贡献网络结构实验结论 文献二摘要 文献三摘要主要贡献网络架构实验 文献四摘要实…

AGV|机器人导航识别二维码视觉传感器TDCS-0100与上位机PLC联机实例说明

目前二维码视觉导航的AGV出货量非常大,几乎都是仓储型AGV使用的导航方式。在地面或者天花板等位置标贴二维码作为标记点,通过扫描读取二维码信息和二维码相对相机的角度来确定当前位置。 本文重点介绍AGV|机器人导航识别二维码视觉传感器TDCS-0100与上位…

linux下线程分离属性

linux下线程分离属性 一、线程的属性---分离属性二、线程属性设置2.1 线程创建前设置分离属性2.2 线程创建后设置分离属性 一、线程的属性—分离属性 什么是分离属性? 首先分离属性是线程的一个属性,有了分离属性的线程,不需要别的线程去接合…

测试ALPHA开发板CAN1的设备树文件

一. 简介 前面一篇文章学习了 ALPHA开发板上的 CAN接口的设备节点信息,文章如下: ALPHA开发板修改CAN的设备树节点信息-CSDN博客 本文对设备树文件进行测试,即开发板加载 .dtb设备树文件。 二. 加载测试 CAN的设备树文件 1. 拷贝设备树…

认识String类

认识String类 前面我们学习了类和对象,这一小节咱们来谈String类 目录 认识String类前言一、String类的创建方式二、String引用类型的特点及方法1.存储内容2.String对象的比较3.字符串查找在这里插入图片描述4.转换(一)数字转为为字符串&…

Swift 结构化并发之全局 Actor 趣谈

概览 在 Swift 结构化并发构成的体系中,一个称为“演员”(Actor)的成员扮演了非常重要的角色,它被用来隔离和同步执行中的数据。 除了普通 Actor 以外,还有一个全局“演员”(Global Actor)的概念,它是做什么的?又有什么与众不同的长处呢? 在本篇博文中,您将学到如…

【Swagger】接口文档生成

文章目录 一、前后端分离开发流程二、YApi导入接口文档三、Swagger3.1 介绍3.2 使用步骤3.2.1 导入 knife4j 的maven依赖3.2.2 在配置类中加入 knife4j 相关配置3.2.3 配置类中设置静态资源映射3.2.4 访问测试 3.3 常用注解3.4 全局参数设置 四、YApi 与 Swagger 一、前后端分离…

网络安全实训Day8

写在前面 网络工程终于讲完了。这星期到了网络安全技术部分。 网络安全实训-网络安全技术 网络安全概述 信息安全:所有保障计算机硬件、系统、软件、数据不因有意或无意的行为导致的服务中断、数据损坏或丢失等安全事件的保障技术 网络安全:基于计算机…