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

(Matlab)遗传算法优化的BP神经网络实现回归预测

目录

摘要:

1.BP神经网络介绍:

2.遗传算法原理介绍:

3.遗传算法优化的BP神经网络:

4.算例分析:

5.相关代码:


摘要:

基于Matalb平台,将遗传算法(GA)与BP神经网络相结合,使用GA优化BP神经网络的主要参数。然后将影响输出响应值的多个特征因素作为GA-BP神经网络模型的输入神经元, 输出响应值作为输出神经元进行预测测试。

1.BP神经网络介绍:

BP神经网络是多层前向型神经网络,一般是由三层神经元构成的,每层有多个神经元且每个神经元自身相互独立。当三层网络模型构建成功后给网络一个输入样本,样本向量开始由输入层神经元传输到隐含层单元,经过中间层逐层处理后又顺序输出到输出层单元,通过传递到输出层单元得出一个实际的样本输出,这种过程是逐层向前的传播修改状态,这就是前向传播过程。当输出的样本向量与期望的输出不符时就产生了误差,误差需要逆向传播,逆向传播的过程也是逐层传递并修改各层连接权值的过程。这样的传递过程需要不断的进行,直到一组训练模式结束或者误差达到了极小值,输出结果满足期望输出为止。通过实验知道经过不断的修改神经元之间的权值和偏置可以使网络的输出在误差允许的范围内拟合所有的训练输入。这个拟合的过程就是神经网络训练的过程,BP网络的梯度下降算法是比较快速的权值调整算法,可以不断地进行误差反向传输从而调整网络结构的权值和阈值达到预期目标。由于BP神经网络的功能特性使它成为使用最为广泛的网络模型之一。

图1 BP神经网络基本结构

2.遗传算法原理介绍:

遗传算法(GeneticAlgorithm,GA)的理论是根据达尔文进化论而设计出来的算法,大体意思是生物是朝着好的方向进化的,在进化的过程中会自动选择优良基因淘汰劣等基因。向好的方向进化就是最优解的方向,优良的基因是符合当前条件的样本基因,可以得到充分的选择。遗传学机理中的生物进化过程中生物的一连串过程包括选测、交叉和变异三个主要的行为机制。因此遗传算法也主要分为选择、交叉和变异这三类操作完成淘汰机制,使训练后的自我进化按照条件朝着有力的方向进行,最终取得最优个体和解集合。作为一种算法的形成还需要编码、遗传变异计算适应度和解码等。

遗传算法的实现过程和运算过程如图2所示。首先需要通过编码组成初始群体形成了遗传算法的基础;以后就是选择交叉和变异再选择的过程。其中种群中个体的遗传算子的操作都是在一定概率的情况下发生的。刚开始的遗传算法集群中的个体向最优解转变是也是随机的。但是需要说明的是这种随机化操作选择操作方法和传统的随机搜索方法是不同的,GA进行的是高效有向的搜索而一般的随机搜索每次操作都是无向的随机搜索。

图2 遗传算法基本运算过程

3.遗传算法优化的BP神经网络:

下面是具体的改进遗传算法优化BP神经网络步骤:

(1)初始化BP神经网络,确定网络结构和学习规则,以及遗传算法的染色体长度。

(2)初始化遗传算法的参数(包括迭代次数,种群大小,交叉概率和突变概率等),以及群体选择遗传算法的所需适应度函数。

(3)使用轮盘赌方法选择几条染色体,以满足适应度函数的要求,作为新人口的父系。

(4)通过改变交叉过程和遗传算法的变化,处理男性父母产生新的人口生成。

(5)判断误差是否达到精度,否定的话重新执行(3)(4)步骤,使染色体不断跟新从而使个体不断更新;当达到目标后找到最优染色体并赋值给BP神经网络的初始权重和阈值。

上述步骤中,重要的步骤是解决遗传算法的编码问题,并选择合适的适应度函数。我们在遗传算法中使用实数编,优化GA算法的主要目的是找到最优秀的蓝色提,用以使得BP神经网络的误差平方和达到最小值。所以我们可以选择BP网络的误差平方和作为遗传算法的适应度函数。适应度函数的公式如下所示:

4.算例分析:

首先导入训练数据:训练输入数据包含15个样本,每个样本有9个特征值,每个训练样本有3个输出具体数据如下所示:

设置遗传算法和BP神经网络的初始参数:

构建GA-BP结构,对BP网络中的参数进寻优优化,到达最大的循环次数后,输出最终的优化变量结果,并使用该优化后的BP神经网络对测试集的数据进行预测,评估预测的准确度。进化过程如下:

具体预测结果如下:

5.相关代码:

本文仅展示部分代码,全部代码点这里:🍞正在为您运送作品详情

clc
clear 
close all
%% 加载神经网络的训练样本 测试样本每列一个样本 输入P 输出T
%样本数据就是前面问题描述中列出的数据
load data
% warning('off')
% 初始隐层神经元个数
hiddennum=31;
inputnum=size(P,1);       % 输入层神经元个数
outputnum=size(T,1);      % 输出层神经元个数
w1num=inputnum*hiddennum; % 输入层到隐层的权值个数
w2num=outputnum*hiddennum;% 隐层到输出层的权值个数
N=w1num+hiddennum+w2num+outputnum; %待优化的变量的个数
%% 定义遗传算法参数
NIND=20;        %个体数目
MAXGEN=10;      %最大遗传代数
PRECI=10;       %变量的二进制位数
GGAP=0.95;      %代沟
px=0.7;         %交叉概率
pm=0.01;        %变异概率
trace=zeros(N+1,MAXGEN);%寻优结果的初始值
FieldD=[repmat(PRECI,1,N);repmat([-0.5;0.5],1,N);repmat([1;0;1;1],1,N)];%区域描述器
Chrom=crtbp(NIND,PRECI*N);%初始种群
%% 优化
gen=0;                                 %代计数器
X=bs2rv(Chrom,FieldD);                 %计算初始种群的十进制转换
ObjV=Objfun(X,P,T,hiddennum,P_test,T_test);        %计算目标函数值
while gen<MAXGEN
   fprintf('%d\n',gen)
   FitnV=ranking(ObjV);                              %分配适应度值
   SelCh=select('sus',Chrom,FitnV,GGAP);              %选择
   SelCh=recombin('xovsp',SelCh,px);                  %教超
   SelCh=mut(SelCh,pm);                               %变异
   X=bs2rv(SelCh,FieldD);               %子代个体的十进制转换
   ObjVSel=Objfun(X,P,T,hiddennum,P_test,T_test);             %计算子代的目标函数值
   [Chrom,ObjV]=reins(Chrom,SelCh,1,1,ObjV,ObjVSel); %重插入子代到父代,得到新种群
   X=bs2rv(Chrom,FieldD);
   gen=gen+1;                                             %代计数器增加
   %获取每代的最优解及其序号,Y为最优解,I为个体的序号
   [Y,I]=min(ObjV);
   trace(1:N,gen)=X(I,:);                       %记下每代的最优值
   trace(end,gen)=Y;                               %记下每代的最优值
end

相关文章:

  • Maven详细笔记
  • (175)FPGA门控时钟技术
  • 20天零基础自学Python | Day9 List列表用法大全
  • K8S的安装kubernetes-dashboard服务起来了,访问不到解决
  • TCP协议(全面总结)
  • 在Adult数据集上使用pandas进行独热编码,之后部署Logistic Regression模型
  • 沉睡者IT - 几种网赚项目引流的方法
  • Dubbo后台管理和监控中心部署
  • Java基于JSP+Servlet的校友论坛管理系统
  • 根据int颜色值获取带透明度的颜色
  • 金仓数据库KingbaseES客户端应用参考手册--17. vacuumdb
  • 【坑货IDEA】Spring项目运行中的问题
  • 金仓数据库KingbaseES客户端编程接口指南-ado.net(3. KingbaseES 驱动在 .NET 平台的配置)
  • tf.gather_nd
  • 软考高项——计算专题
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • Nodejs和JavaWeb协助开发
  • Redis在Web项目中的应用与实践
  • SegmentFault 社区上线小程序开发频道,助力小程序开发者生态
  • Service Worker
  • Shell编程
  • vue2.0开发聊天程序(四) 完整体验一次Vue开发(下)
  • 彻底搞懂浏览器Event-loop
  • 从0实现一个tiny react(三)生命周期
  • 工程优化暨babel升级小记
  • 理解 C# 泛型接口中的协变与逆变(抗变)
  • 让你的分享飞起来——极光推出社会化分享组件
  • 如何邀请好友注册您的网站(模拟百度网盘)
  • 怎么把视频里的音乐提取出来
  • 格斗健身潮牌24KiCK获近千万Pre-A轮融资,用户留存高达9个月 ...
  • 如何在招聘中考核.NET架构师
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​linux启动进程的方式
  • !!java web学习笔记(一到五)
  • # Java NIO(一)FileChannel
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #Z2294. 打印树的直径
  • (2022 CVPR) Unbiased Teacher v2
  • (4)(4.6) Triducer
  • (二开)Flink 修改源码拓展 SQL 语法
  • (六)Hibernate的二级缓存
  • (三)mysql_MYSQL(三)
  • .NET中的Exception处理(C#)
  • /etc/fstab和/etc/mtab的区别
  • @EventListener注解使用说明
  • @NestedConfigurationProperty 注解用法
  • []Telit UC864E 拨号上网
  • [2016.7 day.5] T2
  • [20180129]bash显示path环境变量.txt
  • [BZOJ 3282] Tree 【LCT】
  • [BZOJ3757] 苹果树
  • [bzoj4240] 有趣的家庭菜园
  • [C++]类和对象【上篇】
  • [C++基础]-入门知识
  • [CSAWQual 2019]Web_Unagi ---不会编程的崽