融合正余弦和柯西变异的麻雀搜索算法优化CNN-BiLSTM,实现多输入单输出预测,MATLAB代码...

news2024/12/25 12:43:09

上期作者推出的融合正余弦和柯西变异的麻雀优化算法,效果着实不错,今天就用它来优化一下CNN-BiLSTM。CNN-BiLSTM的流程:将训练集数据输入CNN模型中,通过CNN的卷积层和池化 层的构建,用来特征提取,再经过BiLSTM模型进行序列预测。CNN-BiLSTM模型有众多参数需要调整,包括学习率,正则化参数,神经网络层数,卷积层数,BatchSize,最大训练次数等。

cba50d3c311a00937691985f66b85c92.png

本文采用上一期推出的融合正余弦和柯西变异的麻雀优化算,融合正余弦和柯西变异的麻雀搜索算法,并与灰狼算法,粒子群算法比较,对CNN-BiLSTM的学习率正则化参数BiLSTM隐含层神经元个数进行优化。

数据选用的是一段风速数据,数据较为简单,主要是方便大家后期的替换。数据处理在代码中已经处理好,数据为多输入单输出,即用前n天的数据预测第n+1天的数据。

b38dff806f151dfcae37b355865de984.png

Part 1 预测效果

  • 优化前:

53ee08558f9fd3bdc76f366419f41c3c.png

  • 优化后:

    46fc35ab8c5267c5849d2f2dfd74e517.png5cc118b52fd82830f72f2f20848166ec.pngd25e681174632edd7dae3667a8b01db6.png794b8d7c9b454262414d8e931c10c1a4.png1f13286cdb9c971d50ad1bf852e1f1f1.png

可以看到效果还是杠杠滴!

另外本次代码文件会将“融合正余弦和柯西变异的麻雀搜索算法在CEC函数中的对比代码,也就是这一期的代码一并打包

dde653eb0599c7ff8a292b5b10ae4543.png

Part 2 核心代码

%  参数设置
options0 = trainingOptions('adam', ...                 % 优化算法Adam
    'MaxEpochs', 300, ...                            % 最大训练次数
    'GradientThreshold', 1, ...                       % 梯度阈值
    'InitialLearnRate', 0.01, ...         % 初始学习率
    'LearnRateSchedule', 'piecewise', ...             % 学习率调整
    'LearnRateDropPeriod',100, ...                   % 训练100次后开始调整学习率
    'LearnRateDropFactor',0.01, ...                    % 学习率调整因子
    'L2Regularization', 0.002, ...         % 正则化参数
    'ExecutionEnvironment', 'cpu',...                 % 训练环境
    'Verbose', 1, ...                                 % 关闭优化过程
    'Plots', 'none');                    % 画出曲线


% 网络训练
net0 = trainNetwork(Train_xNorm,Train_yNorm,lgraph0,options0 );


Predict_Ynorm_Test = net0.predict(Test_xNorm);
Predict_Y_Test  = mapminmax('reverse',Predict_Ynorm_Test',yopt);
Predict_Y_Test = Predict_Y_Test';
rmse = sqrt(mean((Predict_Y_Test(1,:)-(Test_y(1,:))).^2,'ALL'));
R2 = 1 - norm(Test_y -  Predict_Y_Test)^2 / norm(Test_y -  mean(Test_y ))^2;
disp(['优化前的RMSE:',num2str(rmse)])
% 预测集拟合效果图
figure
hold on 
plot(Predict_Y_Test,'r-*','LineWidth',1.0)
plot(Test_y,'b-o','LineWidth',1.0)
legend('CNN-BiLSTM预测值','实际值')
ylabel('预测结果')
xlabel('预测样本')
title(['优化前测试集预测结果对比RMSE:',num2str(rmse)])
box off
set(gcf,'color','w')


%% 调用SSA优化CNN-BILSTM
disp('调用SSA优化CNN-BiLSTM......')
% SSA优化参数设置
SearchAgents = 30; % 种群数量  30
Max_iterations = 20; % 迭代次数   20
lowerbound = [0.0001 0.0001 10 10 10]; %五个参数的下限分别是正则化参数,学习率,BiLSTM的三个隐含层个数
upperbound = [0.01 0.01 500 30 30];    %五个参数的上限
dimension = length(lowerbound);%数量,即要优化的LSTM参数个数
[fMin,Best_pos,Convergence_curve,bestnet]  = SCSSAforCNNBILSTM(SearchAgents,Max_iterations,lowerbound,upperbound,dimension,Train_xNorm,Train_yNorm,Test_xNorm,Test_y,yopt,n);


L2Regularization = Best_pos(1,1); % 最佳L2正则化系数
InitialLearnRate = Best_pos(1,2) ;% 最佳初始学习率
NumOfUnits1=    fix(Best_pos(1,3));     % 最佳神经元个数
NumOfUnits2=    fix(Best_pos(1,4));     % 最佳神经元个数
NumOfUnits3=    fix(Best_pos(1,5));     % 最佳神经元个数
disp('优化结束,将最佳net导出并用于测试......')
%% 对训练集的测试
setdemorandstream(pi);
Predict_Ynorm_Train = bestnet.predict(Train_xNorm);  %对训练集的测试
Predict_Y_Train  = mapminmax('reverse',Predict_Ynorm_Train',yopt);  %反归一化
Predict_Y_Train = Predict_Y_Train';


% 适应度曲线
figure
plot(Convergence_curve,'r-', 'LineWidth', 1.5);
title('SCSSA-CNN-BiLSTM', 'FontSize', 10);
legend('适应度值')
xlabel('迭代次数', 'FontSize', 10);
ylabel('适应度值', 'FontSize', 10);
box off
set(gcf,'color','w')


%训练集拟合效果图
figure
hold on 
plot(Predict_Y_Train,'r-*','LineWidth',1.0)
plot(Train_y,'b-o','LineWidth',1.0);    
ylabel('预测结果')
xlabel('预测样本')
legend('SCSSA-CNN-BiLSTM预测值','实际值')
title('优化后训练集预测结果对比')
box off
set(gcf,'color','w')


%% 对测试集的测试
Predict_Ynorm = bestnet.predict(Test_xNorm); 
Predict_Y  = mapminmax('reverse',Predict_Ynorm',yopt);
Predict_Y = Predict_Y';


figure
hold on 
plot(Predict_Y,'r-*','LineWidth',1.0)
plot(Test_y,'b-o','LineWidth',1.0)
legend('SCSSA-CNN-BiLSTM预测值','实际值')
ylabel('预测结果')
xlabel('预测样本')
title('优化后测试集预测结果对比')
box off
set(gcf,'color','w')


%% 回归图与误差直方图
figure;
plotregression(Test_y,Predict_Y,['优化后回归图']);
set(gcf,'color','w')


figure;
ploterrhist(Test_y-Predict_Y,['误差直方图']);
set(gcf,'color','w')


%% 打印出评价指标
% 预测结果评价
ae= abs(Predict_Y - Test_y);
rmse = (mean(ae.^2)).^0.5;
mse = mean(ae.^2);
mae = mean(ae);
mape = mean(ae./Predict_Y);
R = corr(Test_y,Predict_Y);
R2 = 1 - norm(Test_y -  Predict_Y)^2 / norm(Test_y-mean(Test_y ))^2;
disp('预测结果评价指标:')
disp(['RMSE = ', num2str(rmse)])
disp(['MSE  = ', num2str(mse)])
disp(['MAE  = ', num2str(mae)])
disp(['MAPE = ', num2str(mape)])
disp(['相关系数R = ', num2str(R)])
disp(['决定系数R^2为:',num2str(R2)])


disp(['BiLSTM的最佳神经元个数为:', num2str(NumOfUnits1), ',',num2str(NumOfUnits2), ',',num2str(NumOfUnits3)])
disp(['最佳初始学习率为:', num2str(InitialLearnRate)])
disp(['最佳L2正则化系数为:', num2str(L2Regularization)])

代码获取方式,后台回复关键词:

TGDM825

9057cd93cb1fde31061bb0370831aa8d.png

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

(20)操纵杆或游戏手柄

文章目录 前言 20.1 你将需要什么 20.2 校准 20.3 用任务规划器进行设置 20.4 飞行前测试控制装置 20.5 测试失控保护 20.6 减少控制的滞后性 前言 本文解释了如何用操纵杆或游戏手柄控制你的飞行器,使用任务计划器向飞行器发送"RC Override"消息…

【C++基础(六)】类和对象(中) --构造,析构函数

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C初阶之路⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习C   🔝🔝 类和对象-中 1. 前言2. 构造函数3. 构造函数的特性4…

Opencv 细节补充

1.分辨率的解释 •像素:像素是分辨率的单位。像素是构成位图图像最基本的单元,每个像素都有自己的颜色。 •分辨率(解析度): a) 图像分辨率就是单位英寸内的像素点数。单位为PPI(Pixels Per Inch) b) PPI表示的是每英…

从零开始 Spring Cloud 7:Gateway

从零开始 Spring Cloud 7:Gateway 图源:laiketui.com Spring Cloud Gateway 是 Spring Cloud 的一个全新项目,该项目是基于 Spring 5.0,Spring Boot 2.0 和 Project Reactor 等响应式编程和事件流技术开发的网关,它旨…

系统集成|第三章(笔记)

目录 第三章 系统集成专业技术3.1 信息系统建设3.1.1 信息系统3.1.2 信息系统集成 3.2 信息系统设计3.3 软件工程3.4 面向对象系统分析与设计3.5 软件架构3.5.1 软件的架构模式3.5.2 软件中间件 3.6 典型应用集成技术3.6.1 数据库与数据仓库技术3.6.2 Web Services 技术3.6.3 J…

区间预测 | MATLAB实现基于QRF随机森林分位数回归时间序列区间预测模型

区间预测 | MATLAB实现基于QRF随机森林分位数回归时间序列区间预测模型 目录 区间预测 | MATLAB实现基于QRF随机森林分位数回归时间序列区间预测模型效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现基于QRF随机森林分位数回归时间序列区间预测模型&#xff1…

SpringCloud学习路线(10)——分布式搜索ElasticSeach基础

一、初识ES (一)概念: ES是一款开源搜索引擎,结合数据可视化【Kibana】、数据抓取【Logstash、Beats】共同集成为ELK(Elastic Stack),ELK被广泛应用于日志数据分析和实时监控等领域&#xff0…

java——继承

🎄🎄🎄继承 🍆🍆继承的概念: 继承(inheritance)机制:是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类(父类)特性的基础上进行扩展…

挑战css基础面试题

挑战css基础面试题一,看看你能做出来吗 文章目录 前言一、盒模型二、如何实现一个最大的正方形三、文本一行水平居中,多行居左四、画一个三角形五、BFC理解六、两栏布局,左边固定,右边自适应,左右不重叠最后 前言 本片…

springboot快速整合腾讯云COS对象存储

1、导入相关依赖 <!--腾讯云COS--><dependency><groupId>com.tencentcloudapi</groupId><artifactId>tencentcloud-sdk-java</artifactId><version>3.0.1</version></dependency><dependency><groupId>com…

【C语言】指针---初阶

&#x1f341; 博客主页:江池俊的博客 &#x1f341;收录专栏&#xff1a;C语言——探索高效编程的基石 &#x1f341; 如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏&#x1f31f; 三连支持一下博主&#x1f49e; 目录 一、指针是什么&#xff1f; 1.1指…

FTP服务器无法连接解决办法

FTP服务器无法连接解决办法 目录 一&#xff0e; 报错状态二&#xff0e; 解决办法三&#xff0e; 总结 一&#xff0e; 报错状态 二&#xff0e; 解决办法 &#xff08;确保客户机与服务器可以ping通的情况下&#xff0c;再进行下面操作&#xff09; 检查ftp地址是否输错。默…

Kendo UI,一个加速Web应用界面开发的JavaScript组件库!

Kendo UI是什么&#xff1f; 首先&#xff0c;Kendo UI是一个由四个JavaScript UI库组成的包&#xff0c;这些库是专为jQuery、Angular、React和Vue原生构建的&#xff0c;每一个都是用一致的API和主题构建的。所以无论开发者怎么选择&#xff0c;所开发的Web应用始终保持了现…

QueryWrapper,LambdaQueryWrapper用法简介(MyBatis Plus进阶)

目录 一、项目结构及数据库内容如图二、数据库内容三、代码示例 关于如何使用MyBatis Plus自动生成service&#xff0c;mapper&#xff0c;domain参考我的这篇博客&#x1f449;使用MyBatis Plus自动生成service&#xff0c;mapper&#xff0c;domain 一、项目结构及数据库内容…

使用Docker构建LNMP环境并运行Wordpress网站平台

使用Docker构建LNMP环境并运行Wordpress网站平台 1.基于Dockerfile构建LNMP镜像1.1 基于Dockerfile构建nginx镜像1.1.1 修改/usr/local/nginx/conf/nginx.conf文件1.1.2 再次修改nginx服务的Dockerfile文件&#xff08;多级构建&#xff09;1.1.3 创建安装环境依赖包的镜像 1.2…

系统设计《System Design Interview》读书笔记

设计性能认知 延时 操作名称时间1级缓存引用0.5ns2级缓存引用7ns互斥锁/解锁100ns主存引用100ns用zippy压缩1k字节10,000ns10μs通过1GB网络传输2KB字节20,000ns 20μs内存按照顺序读取1MB250,000ns250μs同一个数据中心内的往返500,000ns 500μs磁盘寻找10,000.000ns10ms从…

Qt - .ui 文件的使用

文章目录 目录工具栏Dock Widget代码控制 ui添加资源添加文件 目录 子目录只能输入英文&#xff0c;想要显示中文&#xff0c;可以修改右下方表中的 text 属性&#xff1a; 工具栏 让工具栏共用 菜单栏的 new 和 open&#xff0c;只需将下方列表的控件&#xff0c;拖拽到工具栏…

解决@Scope(“prototype“)不生效的问题

目录 Scope(“prototype“)不生效Scope(“prototype“)正确用法——解决Bean多例问题 1.问题&#xff0c;Spring管理的某个Bean需要使用多例2.问题升级3. Spring给出的解决问题的办法&#xff08;解决Bean链中某个Bean需要多例的问题&#xff09; Scope(“prototype“)不生效 …

STM32(HAL库)驱动st7789LCD屏幕(7引脚240*240)

目录 1、简介 2、CubeMX初始化配置 2.1 基础配置 2.1.1 SYS配置 2.1.2 RCC配置 2.2 屏幕引脚配置 2.3 项目生成 3、KEIL端程序整合 3.1 LCD驱动添加 3.2 函数修改 3.2.1 lcd.h修改 3.2.2 lcd_innit.h 修改 3.2.3 lcd.c修改 3.2.4 lcd_inut.c修改 3.3 主函数代码 3.3…