基于遗传算法修正的BP神经网络算法

本文由用户“zhaoxiaojian1986”分享发布 更新时间:2021-05-26 15:07:52 举报文档

以下为《基于遗传算法修正的BP神经网络算法》的无排版文字预览,完整格式请下载

下载前请仔细阅读文字预览以及下方图片预览。图片预览是什么样的,下载的文档就是什么样的。

本次我们要训练9个15维的输入数据,输出数据为9个3维矩阵,测试输入数据为3个15维数据,测试输出数据为3个3维数据。训练数据和测试数据如下。训练输入数据为P,训练输出数据为T,测试输入数据P_test,测试输出数据为T_test(PS:注意列数代表数据个数,行数代表维数)。

/

///

如果只是想单纯地搭建一个Bp神经网络训练上述数据,并且可以自己对权值和阈值进行赋值,权值和***-0.5,0.5),代码如下。

clear clc %?Examples %?Here?is?how?to?format?a?matrix?so?that?the?minimum?and?maximum?values?of?each?row?are?mapped?to?default?interval?[-1,+1]. %?x1?=?[1?2?4;?1?1?1;?3?2?2;?0?0?0] %?[y1,PS]?=?mapminmax(x1) %?Next,?apply?the?same?processing?settings?to?new?values. %?x2?=?[5?2?3;?1?1?1;?6?7?3;?0?0?0] %?y2?=?mapminmax('apply',x2,PS) %?Reverse?the?processing?of?y1?to?get?x1?again. %?x1_again?=?mapminmax('reverse',y1,PS) %%?构造数据集 load?data.mat inputnum=size(P,1);?????????????????????????????%?输入层神经元个数 hiddennum=2*inputnum+1;?????????????????????????%?隐含层神经元个数 outputnum=size(T,1);????????????????????????????%?输出层神经元个数 %%?数据归一化 [p_train,ps_train]=mapminmax(P,0,1); p_test?=?mapminmax('apply',P_test,ps_train); [t_train,ps_output]=mapminmax(T,0,1); %%?开始构建BP网络 net?=?newff(p_train,t_train,hiddennum);?????????%隐含层为hiddennum个神经元 %设定参数网络参数 net.trainParam.epochs?=?1000; net.trainParam.goal?=?1e-3; net.trainParam.lr?=?0.01; net.trainParam.showwindow=false;????????????????%高某某MATLAB使用?不显示图形框 %%?BP神经网络初始权值和阈值 w1num=inputnum*hiddennum;???????????????????????????????????????????%输入层到隐层的权值个数 w2num=outputnum*hiddennum;??????????????????????????????????????????%隐含层到输出层的权值个数 x=rand(1,w1num+hiddennum+w2num+outputnum)-0.5;??????????????????????%随即生成权值 W1=x(1:w1num);??????????????????????????????????????????????????????%初始输入层到隐含层的权值 B1=x(w1num+1:w1num+hiddennum);??????????????????????????????????????%隐层神经元阈值 W2=x(w1num+hiddennum+1:w1num+hiddennum+w2num);??????????????????????%隐含层到输出层的权值 B2=x(w1num+hiddennum+w2num+1:w1num+hiddennum+w2num+outputnum);??????%输出层阈值 net.iw{1,1}=reshape(W1,hiddennum,inputnum);?????????????????????????%为神经网络的输入层到隐含层权值赋值 net.lw{2,1}=reshape(W2,outputnum,hiddennum);????????????????????????%为神经网络的隐含层到输出层权值赋值 net.b{1}=reshape(B1,hiddennum,1);???????????????????????????????????%为神经网络的隐层神经元阈值赋值 net.b{2}=reshape(B2,outputnum,1);???????????????????????????????????%为神经网络的输出层阈值赋值 %%?开始训练 net?=?train(net,p_train,t_train); %%?测试网络 t_sim?=?sim(net,p_test); T_sim?=?mapminmax('reverse',t_sim,ps_output);???%反归一化 err=norm(T_sim-T_test);?????????????????????????%预测结果与测试结果差的范某某,范某某越小说明预测得越准确,如果范某某为0,说明预测得完全准确 %%?查看训练后的权值与阈值 w1=net.iw{1,1};?????????????????????????????????%初始输入层到隐含层的权值 b1=net.b{1};????????????????????????????????????%隐层神经元阈值 w2=net.lw{2,1};?????????????????????????????????%初始隐层到输出层的权值 b2=net.b{2};????????????????????????????????????%输出层阈值

当然上述训练出来的Bp神经网络的性能可能一般,在这里我们用遗传算法对权值和阈值进行优化。因为权值和阈值都为实数,所以编码方式采用二进制编码。因为采用二进制编码,所以为了方便我们使用谢菲尔德遗传算法工具箱(小编已将这个工具箱上传到文末的链接中)。下载解压后,将gatbx文件夹复制到\toobbox目录下,然后在主页选择预设路径,在弹出窗口点击添加文件夹,把刚才复制到\toobbox目录下的gatbx文件夹路径添加进去,并点击保存按钮。

//

添加后,在命令行窗口输入v=ver('gatbx'),如果出现下面结果,则表示工具箱安装成功。

/

下面进入正题,如何使用遗传算法搜索到合适的权值和阈值?需要搜索权值和阈值的总个数=输入层到隐含测权值个数(隐含层神经元个数*输入层神经元个数)+隐含层到输出层权值个数(输出层神经元个数*隐含层神经元个数)+隐含层神经元个数+输出层神经元个数。

01?|?染色体编码 代码中采用10位二进制的编码方式,权值和阈值的初始值一般是在[-0.5,0.5]之间的随机数,可使用工具箱中的区域描述器Field进行描述。

FieldD=[len;lb;ub;code;scale;lbin;ubin]; 译码矩阵,一般用于二进制串到实值的转换? 其中len是包某某Chrom中每个字符串的长度,lb和ub是行向量, 指明每个变量的下界和上界,code表明如何编码(code=1二进制,code=0格雷), scale指明刻度(scale=0算数,scale=1对数),lbin和ubin表示是否包含边界

所以本代码的区域描述器为,PRECI是二进制的位数(本代码采用10位二进制的编码方式,所以PRECI=10),N是需要搜索权值和阈值的总个数。

FieldD=[repmat(PRECI,1,N);repmat([-0.5;0.5],1,N);repmat([1;0;1;1],1,N)];??????????????????????%区域描述器

使用crtbp(NIND,PRECI*N)函数初始化种群,NIND为种群个体数目。

Chrom=crtbp(NIND,PRECI*N);??????????????????????%初始种群

02?|?染色体解码 然后再使用bs2rv(Chrom,FieldD)函数对染色体进行解码,即将二进制转换为十进制。

X=bs2rv(Chrom,FieldD);?????????????????%计算初始种群的十进制转换

03?| 适应度函数 解码后需要对个体的好坏进行评价,即在当前权值和阈值下,Bp神经网络的预测性能怎么样,这里我们使用norm(T_sim-T_test)函数来进行评价,T_sim是预测结果,T_test是测试数据的输出结果。err是预测结果与测试结果差的范某某,范某某越小说明预测得越准确,如果范某某为0,说明预测得完全准确。

err=norm(T_sim-T_test);?????????????????????????%预测结果与测试结果差的范某某,范某某越小说明预测得越准确,如果范某某为0,说明预测得完全准确

其中err就是个体的适应度值,对每一个个体适应度值的评价函数代码如下。

%%?输入 % x:一个个体的初始权值和阈值 % P:训练样本输入 % T:训练样本输出 % hiddennum:隐含层神经元数 %?P_test:测试样本输入 %?T_test:测试样本期望输出 %%?输出 % err:预测样本的预测误差的范某某 function?[err,T_sim]=BpFunction(x,P,T,hiddennum,P_test,T_test) inputnum=size(P,1);?????????????????????????????%?输入层神经元个数 %?hiddennum=2*inputnum+1;???????????????????????????%?隐含层神经元个数 outputnum=size(T,1);????????????????????????????????%?输出层神经元个数 %%?数据归一化 [p_train,ps_train]=mapminmax(P,0,1); p_test=mapminmax('apply',P_test,ps_train); [t_train,ps_output]=mapminmax(T,0,1); %%?开始构建BP网络 net=newff(p_train,t_train,hiddennum);???????????????%隐含层为hiddennum个神经元 %设定参数网络参数 net.trainParam.epochs=1000; net.trainParam.goal=1e-3; net.trainParam.lr=0.01; net.trainParam.showwindow=false;????????????????????%高某某MATLAB使用?不显示图形框 %%?BP神经网络初始权值和阈值 w1num=inputnum*hiddennum;???????????????????????????????????????????%输入层到隐层的权值个数 w2num=outputnum*hiddennum;??????????????????????????????????????????%隐含层到输出层的权值个数 %?x=2*rand(1,w1num+hiddennum+w2num+outputnum)-1;??????????????????????%随即生成权值 W1=x(1:w1num);??????????????????????????????????????????????????????%初始输入层到隐含层的权值 B1=x(w1num+1:w1num+hiddennum);??????????????????????????????????????%隐层神经元阈值 W2=x(w1num+hiddennum+1:w1num+hiddennum+w2num);??????????????????????%隐含层到输出层的权值 B2=x(w1num+hiddennum+w2num+1:w1num+hiddennum+w2num+outputnum);??????%输出层阈值 net.iw{1,1}=reshape(W1,hiddennum,inputnum);?????????????????????????%为神经网络的输入层到隐含层权值赋值 net.lw{2,1}=reshape(W2,outputnum,hiddennum);????????????????????????%为神经网络的隐含层到输出层权值赋值 net.b{1}=reshape(B1,hiddennum,1);???????????????????????????????????%为神经网络的隐层神经元阈值赋值 net.b{2}=reshape(B2,outputnum,1);???????????????????????????????????%为神经网络的输出层阈值赋值 %%?开始训练 net?=?train(net,p_train,t_train); %%?测试网络 t_sim?=?sim(net,p_test); T_sim?=?mapminmax('reverse',t_sim,ps_output);???%反归一化 err=norm(T_sim-T_test);?????????????????????????%预测结果与测试结果差的范某某,范某某越小说明预测得越准确,如果范某某为0,说明预测得完全准确

对种群中所有个体适应度值进行评价的函数代码如下。

function?Obj=Objfun(X,P,T,hiddennum,P_test,T_test) %%?用来分别求解种群中各个个体的目标值 %%?输入 %?X:所有个体的初始权值和阈值 %?P:训练样本输入 %?T:训练样本输出 %?hiddennum:隐含层神经元数 %?P_test:测试样本输入 %?T_test:测试样本期望输出 %%?输出 %?Obj:所有个体的预测样本的预测误差的范某某 [M,N]=size(X); Obj=zeros(M,1); for?i=1:M %?????Obj(i)=Bpfun(X(i,:),P,T,hiddennum,P_test,T_test); ????Obj(i)=BpFunction(X(i,:),P,T,hiddennum,P_test,T_test); end

04?| 进化操作 接下来就是常规的选择、交叉、变异、重插操作,可以使用工具箱中的函数实现上述操作。

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);

05?| 主函数

将上述程序串在一起,就形成了遗传算法的主函数,可以修改个体数目NIND和最大遗传代数MAXGEN来调整优化效果。

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=40;????????%个体数目 MAXGEN=100;??????%最大遗传代数 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请点击下方选择您需要的文档下载。

  1. 必修4单词
  2. 初稿B4U2 Working the land reading 教学设计 - 副本
  3. 宾语从句基础练习
  4. 一般宏观分析框架
  5. 最新整理:生物必修三基础知识填空(含答案)
  6. 儿童英语培训机构特招班培训协议
  7. 文献阅读笔记
  8. 初中英语教学设计
  9. 8.画思维导图学小学英语语法——表示方法和手段的介词
  10. 李新凤英语课件
  11. 必修一Unit3Traveljournal
  12. Lesson3教案
  13. 《人体形态学》复习要点
  14. 六英U2What a day! (Sound time & Song time)教学设计
  15. pmp-examination-content-outline-july-2020
  16. PMP成绩查询方法
  17. 第一次课 作业1 查词写例句

以上为《基于遗传算法修正的BP神经网络算法》的无排版文字预览,完整格式请下载

下载前请仔细阅读上面文字预览以及下方图片预览。图片预览是什么样的,下载的文档就是什么样的。

图片预览