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

news2024/11/23 11:32:35

今天采用前作者自行改进的一个算法---融合正余弦和折射反向学习的北方苍鹰(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 1
            output(i,1)=1;
        case 2
            output(i,2)=1;
        case 3
            output(i,3)=1;
        case 4
            output(i,4)=1;
        case 5
            output(i,5)=1;
        case 6
            output(i,6)=1;
        case 7
            output(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))+10
    net0=newff(inputn,output_train,hiddennum);
    % 网络参数
    net0.trainParam.epochs=1000;            % 训练次数,这里设置为1000次
    net0.trainParam.lr=0.01;                % 学习速率,这里设置为0.01
    net0.trainParam.goal=0.0001;           % 训练目标最小误差,这里设置为0.0001
    net0.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)));
    end
    outputt=zeros(1,size(YValidation,2));
    for i=1:size(YValidation,2)
        outputt(i)=find(YValidation(:,i)==max(YValidation(:,i)));
    end
    accuracy=sum(outputt==predict_label)/length(outputt);   %计算预测的确率
    disp(['隐含层节点数为',num2str(hiddennum),'时,验证集的准确率为:',num2str(accuracy)])
    
    %更新最佳的隐含层节点
    if acc<accuracy
        acc=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)));
    end
    outputt=zeros(1,size(output_test,2));
    for i=1:size(output_test,2)
        outputt(i)=find(output_test(:,i)==max(output_test(:,i)));
    end
    accuracy=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

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

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

相关文章

达芬奇密码

《达芬奇密码》是一款由德国人发明的桌游&#xff0c;游戏由2-4个人组成。每个玩家执有一定的数字牌&#xff0c;玩家需隐藏你的数字密码&#xff0c;猜透对手的密码&#xff0c;推测可能的答案&#xff0c;打败对手。 24 块塑料立牌&#xff0c;12 个黑色和12个白色。每块上数…

7-25作业

思维导图 QT窗口代码 #include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent) {qDebug()<< this->size();this->resize(1000,800);//设置宽高this->setFixedSize(1000,800);//固定宽高//窗口标题this->setWindowTitle("跟党走…

全志F1C200S嵌入式驱动开发(lcd屏幕驱动)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 lcd RGB屏幕作为比较经济、实用的显示工具,在实际场景中使用较多。它的信号来说,一般也比较简单,除了常规的数据信号,剩下来就是行同步、场同步、数据使能和时钟信号了。数据信…

LED芯片 VAS1260IB05E 带内部开关LED驱动器 汽车硬灯带灯条解决方案

VAS1260IB05E深力科LED芯片是一种连续模式电感降压转换器&#xff0c;设计用于从高于LED电压的电压源高效驱动单个或多个串联连接的LED。该设备在5V至60V之间的输入电源下工作&#xff0c;并提供高达1.2A的外部可调输出电流。包括输出开关和高侧输出电流感测电路&#xff0c;该…

【Linux】进程通信 — 管道

文章目录 &#x1f4d6; 前言1. 通信背景1.1 进程通信的目的&#xff1a;1.2 管道的引入&#xff1a; 2. 匿名管道2.1 匿名管道的原理&#xff1a;2.2 匿名管道的创建&#xff1a;2.3 父子进程通信&#xff1a;2.3.1 read()阻塞等待 2.4 父进程给子进程派发任务&#xff1a;2.5…

使用 OpenCV 进行图像模糊度检测(拉普拉斯方差方法)

写在前面 工作中遇到&#xff0c;简单整理人脸识别中&#xff0c;对于模糊程度较高的图像数据&#xff0c;识别率低&#xff0c;错误率高。虽然使用 AdaFace 模型&#xff0c;对低质量人脸表现尤为突出。但是还是需要对 模糊程度高的图像进行丢弃处理当前通过阈值分类&#xff…

8.python设计模式【组合模式】

内容&#xff1a;将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得用户对单个对象和组合对象的使用具有一致性。角色&#xff1a; 抽象组建&#xff08;component&#xff09;叶子组建(Leaf)复合组建(Composite)客户端 (Client) UML 图 举个例子 需求&#xf…

Mysql-MHA高可用

MHA高可用配置及故障切换 一.MySQL MHA 1.什么是MHA &#xff08;&#xff11;&#xff09;MHA (Master High Availability) 是一套优秀的MySQL高可用环境下故障切换和主从复制的软件。 &#xff08;&#xff12;&#xff09;MHA的出现就是解决MySQL 单点的问题。 &#xff…

elementui el-table折叠表格,点击主表数据展开从表明细

用element-ui 的el-table实现&#xff1a;主表table可实现展开行显示关联的明细表table的列表数据&#xff0c;效果图如下 <el-tableref"tableData"v-loading"listLoading":data"tableData"row-key"id"borderstripehighlight-curr…

idea中设置maven本地仓库和自动下载依赖jar包

1.下载maven 地址&#xff1a;maven3.6.3 解压缩在D:\apache-maven-3.6.3-bin\apache-maven-3.6.3\目录下新建文件夹repository打开apache-maven-3.6.3-bin\apache-maven-3.6.3\conf文件中的settings.xml编辑&#xff1a;新增本地仓库路径 <localRepository>D:\apache-…

十二、数据结构——二叉树基本概念及特点

数据结构中的二叉树 目录 一、二叉树的基本概念 二、二叉树的特点 三、二叉树的分类 四、二叉树的存储结构 (一)、顺序存储 (二)、链式存储 一、二叉树的基本概念 二叉树是一种重要的数据结构&#xff0c;它是每个节点最多有两个子节点的树结构。在二叉树中&#xff0c;每个…

【源码解析】SpringBoot循环依赖源码解析II

前言 前面已经写过循环以来的分析&#xff0c;对循环依赖有一些了解&#xff0c;【源码解析】Spring循环依赖和三级缓存。简单回顾一下&#xff1a; Spring可以解决Autowired注入的循环依赖 Spring解决不了构造器注入的循环依赖 使用Aysnc注解会导致循环依赖。提前暴露的Bea…

Vue基础 --- 路由

1. 前端路由的概念与原理 1.1 什么是路由 路由&#xff08;英文&#xff1a;router&#xff09;就是对应关系。 1.2 SPA 与前端路由 SPA 指的是一个 web 网站只有唯一的一个 HTML 页面&#xff0c;所有组件的展示与切换都在这唯一的一个页面内完成。 此时&#xff0c;不同…

K8s卷存储详解(二)

K8s卷存储详解&#xff08;二&#xff09; 持久卷持久卷&#xff08;PV&#xff09;持久卷申领&#xff08;PVC&#xff09;存储类&#xff08;StorageClass&#xff09;存储制备器&#xff08;Provisioner&#xff09;PV和PVC的生命周期持久卷的类型CSI 卷快照CSI 卷克隆 投射…

《合成孔径雷达成像算法与实现》Figure2.14

%% 插值核 clc close all clear allN 40; x1 -4:1/N:4-1/N; hx sin(pi*x1)./(pi*x1); if x1 0hx 1; end figure plot(x1,hx,k) axis([-4 4,-0.4 1.2]) grid on arrow([-4,0],[4,0],Color,k,Linewidth,1); arrow([0,-0.4],[0,1.2],Color,k,Linewidth,1); %% 初始样本 x2 1…

第一章 函数的连续与间断与 无穷小量

文章目录 前言一、连续二、间断考点 识别间断点解题思路 三、无穷小量无穷小量的加减运算与比较无穷小的题型与解答 四、曲线的渐近线1、概念2、分类3、例题 前言 一、连续 二、间断 考点 识别间断点 解题思路 三、无穷小量 无穷小量的加减运算与比较 无穷小的题型与解答 四、曲…

高效协作处理缓存清理需求:生产者-消费者模式助力多模块缓存管理

在现代应用系统中&#xff0c;缓存是提高性能和减少数据库负载的重要手段之一。然而&#xff0c;缓存的数据在某些情况下可能会过期或者变得无效&#xff0c;因此需要及时进行清理。在复杂的应用系统中&#xff0c;可能有多个系统、多个模块产生缓存清理需求&#xff0c;而这些…

从实践彻底掌握MySQL的主从复制

目录 一、本次所用结构如图---一主多从级联&#xff1a; 二、IP。 三、配置M1&#xff1a; 四、从库M1S1&#xff1a; 五、从库M2配置&#xff1a; 六、 从库M2S1&#xff1a; 一、本次所用结构如图--- 一主多从级联&#xff1a; 二、IP。这里M1S1和M1S2一样的&#xff0…

怎么学习Java框架和库相关知识? - 易智编译EaseEditing

学习Java框架和库相关知识可以遵循以下步骤&#xff1a; 确定学习方向&#xff1a; Java拥有众多的框架和库&#xff0c;例如Spring、Hibernate、JavaFX、Apache Commons等。首先确定你感兴趣的方向和应用场景&#xff0c;然后选择相应的框架和库进行学习。 官方文档和教程&a…

Linux 学习记录56(ARM篇)

Linux 学习记录56(ARM篇) 本文目录 Linux 学习记录56(ARM篇)一、总线概念1. 总线2. 串行总线3. 并行总线4. 单工/半双工/全双工5. 同步6. 异步 二、串口(UART)1. 串口配置信息2. 串口通信协议(异步串行全双工总线)3. 框图分析4. 使能串口5. GPIO的复用模式6. RCC时钟7. UART寄存…