免费分享-MATLAB代码融合正余弦和柯西变异的麻雀优化算法SCSSA-CNN-BiLSTM双向长短期记忆网络预测模型

news2024/12/23 17:56:36

融合正余弦和柯西变异的麻雀优化算法SCSSA-CNN-BiLSTM双向长短期记忆网络预测模型

通过融合正余弦和柯西变异改进麻雀搜索算法,对CNN-BiLSTM的学习率、正则化参数以及BiLSTM隐含层神经元个数等进行优化

预测效果图如下

代码如下:

%%  清空环境变量
warning off             % 关闭报警信息
close all               % 关闭开启的图窗
clear                   % 清空变量
clc  

%% 导入数据
data =  xlsread('data.xls');
[h1,l1]=data_process(data,8);  
data = [h1,l1];
[m,n]=size(data);
input = data(:,1:n);
output = data(:,n);

numTimeStepsTrain = floor(0.7*numel(data(:,1)));  %取70%的数据作为训练集

XTrain = input(1:numTimeStepsTrain,:);
YTrain = output(1:numTimeStepsTrain,:);

XTest = input(numTimeStepsTrain+1:end,:);
YTest = output(numTimeStepsTrain+1:end,:);

x = XTrain;
y = YTrain;

[xnorm,xopt] = mapminmax(x',0,1);
[ynorm,yopt] = mapminmax(y',0,1);


% 转换成2-D image
for i = 1:length(ynorm)
    Train_xNorm{i} = reshape(xnorm(:,i),n,1,1);
    Train_yNorm(:,i) = ynorm(:,i);
    Train_y(i,:) = y(i,:);
end
Train_yNorm= Train_yNorm';


xtest = XTest;
ytest = YTest;
[xtestnorm] = mapminmax('apply', xtest',xopt);
[ytestnorm] = mapminmax('apply',ytest',yopt);
xtest = xtest';
for i = 1:length(ytestnorm)
  Test_xNorm{i} = reshape(xtestnorm(:,i),n,1,1);
  Test_yNorm(:,i) = ytestnorm(:,i);
  Test_y(i,:) = ytest(i,:);
end
Test_yNorm = Test_yNorm';


%% 优化算法优化前,构建优化前的CNN-BILSTM模型
inputSize = n;
outputSize = 1;  %数据输出y的维度  

layers0 = [ ...
    
    sequenceInputLayer([inputSize,1,1],'name','input')   %输入层设置
    sequenceFoldingLayer('name','fold')         %使用序列折叠层对图像序列的时间步长进行独立的卷积运算。
    
    convolution2dLayer([2,1],10,'Stride',[1,1],'name','conv1')  %添加卷积层,2,1表示过滤器大小,10过滤器个数,Stride是垂直和水平过滤的步长
    batchNormalizationLayer('name','batchnorm1')  % BN层,用于加速训练过程,防止梯度消失或梯度爆炸
    reluLayer('name','relu1')       % ReLU激活层,用于保持输出的非线性性及修正梯度的问题
    
    convolution2dLayer([1,1],10,'Stride',[1,1],'name','conv2')       %添加卷积层,2,1表示过滤器大小,10过滤器个数,Stride是垂直和水平过滤的步长
    batchNormalizationLayer('name','batchnorm2')        % BN层,用于加速训练过程,防止梯度消失或梯度爆炸
    reluLayer('name','relu2')           % ReLU激活层,用于保持输出的非线性性及修正梯度的问题
    
    maxPooling2dLayer([1,5],'Stride',1,'Padding','same','name','maxpool')   % 第一层池化层,包括3x3大小的池化窗口,步长为1,same填充方式
    sequenceUnfoldingLayer('name','unfold')       %独立的卷积运行结束后,要将序列恢复
    flattenLayer('name','flatten')
    
    bilstmLayer(3,'Outputmode','last','name','hidden1') 
    dropoutLayer(0.2,'name','dropout_1')        % Dropout层,以概率为0.3丢弃输入

    bilstmLayer(5,'Outputmode','sequence','name','hidden3') 
    dropoutLayer(0.3,'name','dropout_3')        % Dropout层,以概率为0.3丢弃输入

    bilstmLayer(5,'Outputmode','last','name','hidden2') 
    dropoutLayer(0.3,'name','drdiopout_2')

    fullyConnectedLayer(outputSize,'name','fullconnect')   % 全连接层设置(影响输出维度)(cell层出来的输出层) %
    
    tanhLayer('name','softmax')
    regressionLayer('name','output')];

lgraph0 = layerGraph(layers0);
lgraph0 = connectLayers(lgraph0,'fold/miniBatchSize','unfold/miniBatchSize');


%  参数设置
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 = 20; % 种群数量  30
Max_iterations = 30; % 迭代次数   20
lowerbound = [0.0001 0.0001 10 10 10]; %五个参数的下限分别是正则化参数,学习率,BiLSTM的三个隐含层个数
upperbound = [0.01 0.01 300 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)])

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

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

相关文章

Vue(七) TodoList案例1.0

文章目录 组件化编码流程(通用)1. 拆分静态组件2. 初始化列表展示动态数据如何让一个标签动态的拥有某一个属性 3. 按回车添加todo子组件给父组件传值之props 4. 勾选与取消勾选一个Todo5. 删除6. footer底部统计7. footer底部交互7.1 全选框自动打勾7.2 全选框取消勾选 8. 清除…

【java】vscode配置javaweb开发环境

下载jdk https://www.oracle.com/java/technologies/downloads/?er221886下载完毕直接安装,安装完毕自动添加以下环境变量 在cmd中运行 java -version出现以下代表成功 再添加系统变量 下载Maven https://maven.apache.org/download.cgi下载完解压放到自己方…

win10环境下gvim离线配置插件的一些补充

0 总述 在上一篇博客,即《Windows系统下使用gvim配置LaTeX快速书写环境》一文中,本小白试图模仿神级人物Gilles Castel,打造vim下的 LaTeX \LaTeX LATE​X书写环境。实话实说,东施效颦了。虽不至于一无所得,但也仅仅算…

STM32通过ADM3222完成UART转232通信电平转换

1、简介 单片机默认串口输出电平是UART信号,但是在实际项目中经常需要将其转换成232电平,此时就需要ADM3222芯片来完成电平的转换,下面对使用过程进行总结。 2、硬件电路 从上图中可以看到芯片需要对1、18进行配置才能进行工作,通过查阅手册可知,1引脚需要配置低电平,…

生物信息学:DNA序列的构成

DNA序列是由一串字母表示的真实的或者假设的携带基因信息的DNA分子的一级结构。‌ DNA序列的构成基于四种特定的碱基,分别是腺嘌呤(A)、胸腺嘧啶(T)、鸟嘌呤(G)和胞嘧啶(C&#xff…

【机器学习】K近邻(K-Nearest Neighbors,简称KNN)的基本概念以及消极方法和积极方法的区别

引言 K近邻(K-Nearest Neighbors,简称KNN)算法是一种基础的机器学习方法,属于监督学习范畴 文章目录 引言一、K近邻(K-Nearest Neighbors,简称KNN)1.1 原理详述1.1.1 距离度量1.1.2 选择k值1.1.…

django网吧收费管理系统 项目源码26819

摘 要 随着互联网的普及,网吧作为公共互联网接入场所,依旧在许多地区发挥着重要作用。现代网吧不仅仅是提供上网服务的场所,还包括了游戏、社交、休闲等多功能体验。为了提高网吧的服务质量和运营效率,迫切需要一个高效的管理系统…

采集工具选型调研

原文阅读:【巨人肩膀社区博客分享】采集工具选型调研 大家一起来探讨SeaTunnel方案,简化当前Dinky与chunjun的双轨模式(Dinky仅用于实时同步,chunjun负责离线处理)。提议小组一起共议,并由大数据组构建dem…

大模型battle,哪家才是真的“价美”也“物美”

大模型battle,哪家才是真的“价美”也“物美” 物美价廉何为物美价廉大模型battle基础能力测试:专业能力测试:中文特性能力测试:逻辑推理能力测试:创新能力测试:安全性与合规性测试:写在最后 近…

【Qt窗口】—— 对话框

目录 (一) 对话框介绍 (二)对话框的分类 2.1 模态对话框 2.2 非模态对话框 2.3 混合属性对话框 (三)内置对话框 消息对话框 QMessageBox 颜色对话框 QColorDialog 字体对话框 QFontDialog 输入对…

RK3588 系列之1—串口连接

RK3588 系列之1—串口连接 1.串口转USB芯片驱动2.使用MobaXterm进行串口链接3.注意事项 1.串口转USB芯片驱动 根据使用的芯片安装不同的驱动,常见的如CH340。装完驱动后,通过设备管理器,查看开发板与个人PC连接情况,记住占用的端…

超声波智能水表通讯方式有哪些?

超声波智能水表采用多种通讯方式实现数据传输,包括但不限于有线连接、无线网络、以及短距离无线通信技术,这些方式各有优劣,适用于不同的应用场景。 一、通讯方式概述 1.有线通讯 -RS-485接口:这是一种半双工的串行通信接口标准…

微服务框架二

微服务 微服务技术栈 服务发现概念 服务发现两种方式 客户端发现 服务端服务发现 服务发现技术对比 Nacos架构图 基于dubbo nacos服务调用 Nacos核心源码解析 registery 具体实现在nacosServiceRegistery setbeat 返回clientBeatInterval

cannot import name ‘greycomatrix‘ from ‘skimage.feature.texture‘ 解决方法

症状: ImportError: cannot import name ‘greycomatrix’ from ‘skimage.feature’ (D:\ProgramData\anaconda3\Lib\site-packages\skimage\feature_init_.py) 解决方案 将涉及的grey全部替换为gray即可

黑神话·悟空亢金龙怎么打?亢金龙全攻略

走到湖心庙宇,长得像弥勒缩小版的小和尚出现了。 他为师为师的叫着,似乎还想收天命人为徒,跟着他修行似得。 不过,他身上的乾坤袋出卖了自己,不是黄眉大仙是谁? 不知为何,曾经从金铙里救出悟空的亢金龙居…

Minkowski分形电路生成工具[程序附后]

此工具用于生成Minkowski分形电路,应用领域可参考分形电路的纪录片或CNKI论文。运行环境在Altium Designer中,可用于Altium Designer全系列的版本中。 程序界面如下图所示,可以支持外框和迭代次数的更改。 程序下载链接: Minkows…

加载:loader实现

1、利用内联汇编显示字符串 通过反复调用BIOS显示字符的方式来显示一个完整的字符串,该功能将用于loader在初始化过程中显示初始化进度、错误信息。 具体代码 // 16位代码,必须加上放在开头,以便有些io指令生成为32位 __asm__(".code…

STM32外设SPI(串行通信),W25Q64(8Mb)

1 非易失存储器:E2PROM,FLASH(断电不丢失) 2 易失存储器:SRAM,DRAM 3 W25Q64 1 从00 00 00 到 7F FF FF 2 block(块),sector(扇区) ,page(页区) 写数据到FLASH(256字节) 读数据很快&#…

002.Python爬虫系列_初识协议

我 的 个 人 主 页:👉👉 失心疯的个人主页 👈👈 入 门 教 程 推 荐 :👉👉 Python零基础入门教程合集 👈👈 虚 拟 环 境 搭 建 :👉&…

论文学习哇

2024.7.18 1.A gated cross-domain collaborative network for underwater object detection 对图像进行增强 摘要:水下存在低对比度和低光的问题,有的学者通过水下图像增强来提高图片质量,但会移除或者改变水下物体的细节。所以作者探索两…