当前位置: 首页 > news >正文

改进的北方苍鹰算法优化BP神经网络---回归+分类两种案例

今天采用前作者自行改进的一个算法---融合正余弦和折射反向学习的北方苍鹰(SCNGO)优化算法优化BP神经网络。

文章一次性讲解两种案例,回归分类。回归案例中,作者选用了一个经典的股票数据。分类案例中,选用的是公用的UCI数据集。

BP神经网络初始的权值阈值都是随机生成的,因此不一定是最佳的。采用智能算法优化BP神经网络的权值阈值,使得输入与输出有更加完美的映射关系,以此来提升BP神经网络模型的精度。本文采用SCNGO算法对BP神经网络的权值阈值进行优化,并应用于实际的回归和分类案例中。

01 股票预测案例

案例虽然介绍的是股票预测,但是SCNGO-BP预测模型是通用的,大家根据自己的数据直接替换即可。

股票数据特征有:开盘价,盘中最高价,盘中最低价,收盘价等。预测值为股票价格。股票数据整理代码已写好,想换成自己数据的童鞋不需要理解此代码,替换数据即可。下面直接上标准BP的预测结果和SCNGO-BP的预测结果。

标准BP模型预测结果

513358744c5504dad655c7860dce0694.png

可以看到标准BP神经网络的预测效果不是很理想,无法跟踪真实值偏差较大

SCNGO-BP预测结果

可以看到SCNGO-BP神经网络的预测值可以紧密跟随真实值,效果很好。

a7011432c9445eb6169fcf95078c98ee.png

将真实值,BP预测值和SCNGO-BP预测值放在一起,效果更加明显。4f8a0b8413acc0956fcf04fb029340fa.png

接下来是一个SCNGO优化前后的BP神经网络误差对比图。

e5280cb9f8914628da3f36055cca283f.png

SCNGO-BP的迭代曲线,以预测值和真实值的MSE为目标函数。

7716c6c82caf134325fc2731ada07aac.png

SCNGO-BP预测模型的评价:可以看到,SCNGO-BP方法在股票预测案例中可以很好地进行股票价格预测。

02 分类案例

接下来是SCNGO-BP的分类案例,采用的数据是UCI数据集中的Balancescale.mat数据,该数据一共分为三类。接下来看结果。

标准BP模型分类结果

混淆矩阵结果图:

简单说一下这个图该怎么理解。请大家横着看,每行的数据加起来是100%,每行的数据个数加起来就是测试集中第一类数据的真实个数。以第一行为例,测试集中一共有12个数据是属于第一类的,而12个数据中,有8个预测正确,有1个预测成了第2类,3个预测成了第三类。其他行均这样理解。

6d92feaab7b923753d33028801d76fbc.png

下面这个图是另一种结果展现方式,在一些论文中会用这种方式展示结果。

59480c8a67e1efa93b96856171a40004.png

SCNGO-BP分类结果:

03868d31f1f1003b75d68cb402e24cf6.png

fd90977a7697a79ecc6d8f0a437cfc73.png

d24c9453614e8bc9adbc91c1ddf61224.png

03 代码展示

%% 初始化
clear
close all
clc
warning off
addpath(genpath(pwd));
% rng(0)
load Balancescale.mat 
data = Balancescale;
data=data(randperm(size(data,1)),:);    %此行代码用于打乱原始样本,使训练集测试集随机被抽取,有助于更新预测结果。
input=data(:,2:end);
output1 =data(:,1);
for i=1:size(data,1)switch output1(i)case 1output(i,1)=1;case 2output(i,2)=1;case 3output(i,3)=1;case 4output(i,4)=1;case 5output(i,5)=1;case 6output(i,6)=1;case 7output(i,7)=1;end
end
%% 划分训练集和测试集
m=fix(size(data,1)*0.7);    %训练的样本数目
%训练集
input_train=input(1:m,:)';
output_train=output(1:m,:)';
% 测试集
input_test=input(m+1:end,:)';
output_test=output(m+1:end,:)';%% 数据归一化
[inputn,inputps]=mapminmax(input_train,0,1);
inputn_test=mapminmax('apply',input_test,inputps);
dam = fix(size(inputn,2)*0.3);%选30%的训练集作为验证集
idx = randperm(size(inputn,2),dam);
XValidation = inputn(:,idx);
inputn(:,idx) = [];
YValidation = output_train(:,idx);
output_train(:,idx) = [];%% 获取输入层节点、输出层节点个数
inputnum=size(input_train,1);
outputnum=size(output_train,1);
disp('/')
disp('神经网络结构...')
disp(['输入层的节点数为:',num2str(inputnum)])
disp(['输出层的节点数为:',num2str(outputnum)])
disp(' ')
disp('隐含层节点的确定过程...')%确定隐含层节点个数
%采用经验公式hiddennum=sqrt(m+n)+a,m为输入层节点个数,n为输出层节点个数,a一般取为1-10之间的整数
acc = 0;
for hiddennum=fix(sqrt(inputnum+outputnum))+1:fix(sqrt(inputnum+outputnum))+10net0=newff(inputn,output_train,hiddennum);% 网络参数net0.trainParam.epochs=1000;            % 训练次数,这里设置为1000次net0.trainParam.lr=0.01;                % 学习速率,这里设置为0.01net0.trainParam.goal=0.0001;           % 训练目标最小误差,这里设置为0.0001net0.trainParam.show=25;                % 显示频率,这里设置为每训练25次显示一次net0.trainParam.mc=0.001;                % 动量因子net0.trainParam.min_grad=1e-8;          % 最小性能梯度net0.trainParam.max_fail=6;             % 最高失败次数net0.trainParam.showWindow = false;net0.trainParam.showCommandLine = false; % 网络训练[net0,tr]=train(net0,inputn,output_train);an0=sim(net0,XValidation);  %验证集的仿真结果predict_label=zeros(1,size(an0,2));for i=1:size(an0,2)predict_label(i)=find(an0(:,i)==max(an0(:,i)));endoutputt=zeros(1,size(YValidation,2));for i=1:size(YValidation,2)outputt(i)=find(YValidation(:,i)==max(YValidation(:,i)));endaccuracy=sum(outputt==predict_label)/length(outputt);   %计算预测的确率disp(['隐含层节点数为',num2str(hiddennum),'时,验证集的准确率为:',num2str(accuracy)])%更新最佳的隐含层节点if acc<accuracyacc=accuracy;hiddennum_best=hiddennum;end
end
disp(['最佳的隐含层节点数为:',num2str(hiddennum_best),',验证集相应的训练集的准确率为:',num2str(acc)])%% 构建最佳隐含层节点的BP神经网络
disp(' ')
disp('标准的BP神经网络:')
net0=newff(inputn,output_train,hiddennum_best,{'tansig','purelin'},'trainlm');% 建立模型
%网络参数配置
net0.trainParam.epochs=1000;         % 训练次数,这里设置为1000次
net0.trainParam.lr=0.01;                   % 学习速率,这里设置为0.01
net0.trainParam.goal=0.00001;                    % 训练目标最小误差,这里设置为0.0001
net0.trainParam.show=25;                % 显示频率,这里设置为每训练25次显示一次
net0.trainParam.mc=0.01;                 % 动量因子
net0.trainParam.min_grad=1e-6;       % 最小性能梯度
net0.trainParam.max_fail=6;               % 最高失败次数
% net0.trainParam.showWindow = false;
% net0.trainParam.showCommandLine = false;            %隐藏仿真界面
%开始训练
net0=train(net0,inputn,output_train);%预测
an0=sim(net0,inputn_test); %用训练好的模型进行仿真
predict_label=zeros(1,size(an0,2));for i=1:size(an0,2)predict_label(i)=find(an0(:,i)==max(an0(:,i)));endoutputt=zeros(1,size(output_test,2));for i=1:size(output_test,2)outputt(i)=find(output_test(:,i)==max(output_test(:,i)));endaccuracy=sum(outputt==predict_label)/length(outputt);   %计算预测的确率  disp(['准确率为:',num2str(accuracy)])
%% 标准BP神经网络作图
% 画方框图
figure
confMat = confusionmat(outputt,predict_label);  %output_test是真实值标签
zjyanseplotConfMat(confMat.');  
xlabel('Predicted label')
ylabel('Real label')
% 作图
figure
scatter(1:length(predict_label),predict_label,'r*')
hold on
scatter(1:length(predict_label),outputt,'g^')
legend('预测类别','真实类别','NorthWest')
title({'BP神经网络的预测效果',['测试集正确率 = ',num2str(accuracy*100),' %']})
xlabel('预测样本编号')
ylabel('分类结果')
box on
set(gca,'fontsize',12)

代码中注释非常详细,有对神经网络构建的注释,有对SCNGO-BP代码的注释,简单易懂。

代码附带UCI常用的数据集及其解释。大家可以自行尝试别的数据进行分类。附带SCNGO在CEC2005函数的测试代码。

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

SCNGOBP

相关文章:

改进的北方苍鹰算法优化BP神经网络---回归+分类两种案例

今天采用前作者自行改进的一个算法---融合正余弦和折射反向学习的北方苍鹰(SCNGO)优化算法优化BP神经网络。 文章一次性讲解两种案例&#xff0c;回归与分类。回归案例中&#xff0c;作者选用了一个经典的股票数据。分类案例中&#xff0c;选用的是公用的UCI数据集。 BP神经网络…...

等保工作如何和企业创新业务发展相结合,实现“安全”和“创新”的火花碰撞?

等保工作如何和企业创新业务发展相结合&#xff0c;实现“安全”和“创新”的火花碰撞&#xff1f;在当今数字化浪潮的背景下&#xff0c;企业越来越需要在“安全”和“创新”之间找到平衡点&#xff0c;以实现业务的持续创新和安全的有效保障。等保工作可以为企业提供安全保障…...

23.7.25 杭电暑期多校3部分题解

1005 - Out of Control 题目大意 解题思路 code 1009 - Operation Hope 题意、思路待补 code #include <bits/stdc.h> using namespace std; const int N 1e5 9; struct lol {int x, id;} e[3][N * 2]; int t, n, a[3][N * 2], hd[3], tl[3], vis[N * 2], q[N * …...

【设计模式——学习笔记】23种设计模式——桥接模式Bridge(原理讲解+应用场景介绍+案例介绍+Java代码实现)

问题引入 现在对不同手机类型的不同品牌实现操作编程(比如:开机、关机、上网&#xff0c;打电话等)&#xff0c;如图 【对应类图】 【分析】 扩展性问题(类爆炸)&#xff0c;如果我们再增加手机的样式(旋转式)&#xff0c;就需要增加各个品牌手机的类&#xff0c;同样如果我们…...

文档翻译软件那么多,哪个能满足你的多语言需求?

想象一下&#xff0c;你手中拿着一份外文文件&#xff0c;上面记录着珍贵的知识和信息&#xff0c;但是语言的障碍让你无法领略其中的内容。而此时&#xff0c;一位翻译大师闪亮登场&#xff01;他的翻译技巧犹如一把魔法笔&#xff0c;能够将文字的魅力和意境完美传递。无论是…...

MySQL 中NULL和空值的区别

MySQL 中NULL和空值的区别&#xff1f; 简介NULL也就是在字段中存储NULL值&#xff0c;空值也就是字段中存储空字符(’’)。区别 1、空值不占空间&#xff0c;NULL值占空间。当字段不为NULL时&#xff0c;也可以插入空值。 2、当使用 IS NOT NULL 或者 IS NULL 时&#xff0…...

阿里云容器镜像仓库(ACR)的创建和使用

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…...

工业的相机与镜头(简单选型)

面阵相机&#xff0c;需要多大的分辨率&#xff1f;多少帧数&#xff1f; 前提条件&#xff1a; 1.被检测的物体大小 2.要求检测的精度是多少 3.物体是否在运动过程中进行检测&#xff0c;速度是多少 线阵相机选择(分辨率、扫描行数) 行频&#xff1a;每秒扫描多少行&#xf…...

numpy广播机制介绍

广播 广播机制的意义&#xff1a;广播描述了在算术运算期间NumPy如何处理具有不同形状的数组。受某些约束条件的限制&#xff0c;较小的数组会在较大的数组中“广播”&#xff0c;以便它们具有兼容的形状。 在对两个数组进行操作时&#xff0c;NumPy按元素对它们的形状进行比…...

RocketMQ 5.0 无状态实时性消费详解

作者&#xff1a;绍舒 背景 RocketMQ 5.0 版本引入了 Proxy 模块、无状态 pop 消费机制和 gRPC 协议等创新功能&#xff0c;同时还推出了一种全新的客户端类型&#xff1a;SimpleConsumer。 SimpleConsumer 客户端采用了无状态的 pop 机制&#xff0c;彻底解决了在客户端发布…...

本地 IDC 中的 K8s 集群如何以 Serverless 方式使用云上计算资源

作者&#xff1a;庄宇 在前一篇文章《应对突发流量&#xff0c;如何快速为自建 K8s 添加云上弹性能力》中&#xff0c;我们介绍了如何为 IDC 中 K8s 集群添加云上节点&#xff0c;应对业务流量的增长&#xff0c;通过多级弹性调度&#xff0c;灵活使用云上资源&#xff0c;并通…...

MySQL - 安装、连接、简单介绍

1、安装 MySQL8.0 安装MySQL 8.0的步骤&#xff0c;以 Windows 为例&#xff1a; 1.1 下载MySQL Installer&#xff1a; 需要从MySQL官方网站下载MySQL Installer。在下载页面中&#xff0c;选择适用于Windows的MySQL Installer并下载。 1.2 运行MySQL Installer&#xff1…...

【算法】求欧拉函数(包括完整的证明以及代码模板,建议收藏)

求欧拉函数 前置知识 互质&#xff1a;互质是公约数只有1的两个整数&#xff0c;叫做互质整数。 欧拉函数定义 1 ∼ N − 1 1∼N-1 1∼N−1中与N互质的数的个数被称为欧拉函数&#xff0c;记为 ϕ ( N ) \phi(N) ϕ(N)。 若在算数基本定理中&#xff0c; N p 1 a 1 p 2 a 2 .…...

Ceph的应用

文章目录 一、创建 CephFS 文件系统 MDS 接口1&#xff09;在管理节点创建 mds 服务2&#xff09;查看各个节点的 mds 服务3&#xff09;创建存储池&#xff0c;启用 ceph 文件系统4&#xff09;查看mds状态&#xff0c;一个up&#xff0c;其余两个待命&#xff0c;目前的工作的…...

mac m1 触控栏TouchBar功能栏异常

电脑可能在高温下运行时间过长&#xff0c;导致TouchBar之前正常显示的调整屏幕亮度与调整声音等功能的按钮均丢失&#xff0c;然后看了一眼键盘设置&#xff0c;设置也是正常的&#xff0c;已勾选显示功能栏 下面请看 如何在MacBook Pro&#xff08;macOS Monterey&#xff0…...

“奢侈品”价格的“快消品”,竹叶青这么想赚年轻人的“茶水钱”?

文 | 螳螂观察 作者 | 青月 或许是受养生焦虑的影响&#xff0c;这届年轻人似乎爱上了喝茶。 《抖音电商茶行业洞察报告》数据显示&#xff0c; 年轻客群已经成为了抖音电商茶行业的增长极&#xff0c;在茶叶、茶具、茶文化书籍等方面&#xff0c;18-30岁消费者是当之无愧消…...

【Matlab】基于随机森林算法的时间序列预测(Excel可直接替换数据)

【Matlab】基于随机森林算法的时间序列预测(Excel可直接替换数据) 1.模型原理2.数学公式3.文件结构4.Excel数据5.分块代码6.完整代码7.运行结果1.模型原理 基于随机森林算法的时间序列预测是一种利用随机森林模型来解决时间序列预测问题的方法。在传统的随机森林算法中,对于…...

vue 中断请求

1 背景&#xff1a;针对一些请求时间较长&#xff0c;组件销毁后即中断请求&#xff1b; 2 方法&#xff1a; data(){return {//用于取消请求abortController:new AbortController(), } }, created(){//请求接口this.groundAcquisition(); }, beforeDestroy(){//中断请求this.…...

Jwt(Json web token)——从Http协议到session+cookie到Token Jwt介绍 Jwt的应用:登陆验证的流程

目录 引出从Http协议到session&cookie到TokenHTTP协议session & cookiesessioncookie为什么需要session & cookie? JavaEE传统解决长连接方案问题&#xff1a;分布式不适用解决方案&#xff1a;令牌Token Jwt&#xff0c;Json web tokenjwt的结构Header加密算法Ba…...

Java使用 java.util.regex.Pattern 正则表达式校验参数值是否规范

场景&#xff1a; java中我们可以利用 Pattern 注解对某个入参进行规则校验&#xff0c;但有些特殊参数在接口入口处不方便校验&#xff0c;需要在代码中校验 一、使用 Pattern 注解校验 Pattern(regexp "^[a-zA-Z0-9]$", message "xxx号限输入字母、…...

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…...

Java 语言特性(面试系列2)

一、SQL 基础 1. 复杂查询 &#xff08;1&#xff09;连接查询&#xff08;JOIN&#xff09; 内连接&#xff08;INNER JOIN&#xff09;&#xff1a;返回两表匹配的记录。 SELECT e.name, d.dept_name FROM employees e INNER JOIN departments d ON e.dept_id d.dept_id; 左…...

Java 8 Stream API 入门到实践详解

一、告别 for 循环&#xff01; 传统痛点&#xff1a; Java 8 之前&#xff0c;集合操作离不开冗长的 for 循环和匿名类。例如&#xff0c;过滤列表中的偶数&#xff1a; List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分

一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计&#xff0c;提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合&#xff1a;各模块职责清晰&#xff0c;便于独立开发…...

智能分布式爬虫的数据处理流水线优化:基于深度强化学习的数据质量控制

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业和研究机构的核心资产。智能分布式爬虫作为高效的数据采集工具&#xff0c;在大规模数据获取中发挥着关键作用。然而&#xff0c;传统的数据处理流水线在面对复杂多变的网络环境和海量异构数据时&#xff0c;常出现数据质…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...