以下为《基于遗传算法修正的BP神经网络算法》的无排版文字预览,完整格式请下载
下载前请仔细阅读文字预览以及下方图片预览。图片预览是什么样的,下载的文档就是什么样的。
本次我们要训练9个15维的输入数据,输出数据为9个3维矩阵,测试输入数据为3个15维数据,测试输出数据为3个3维数据。训练数据和测试数据如下。训练输入数据为P,训练输出数据为T,测试输入数据P_test,测试输出数据为T_test(PS:注意列数代表数据个数,行数代表维数)。
/
///
如果只是想单纯地搭建一个Bp神经网络训练上述数据,并且可以自己对权值和阈值进行赋值,权值和***-0.5,0.5),代码如下。
clearclc%?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.matinputnum=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来调整优化效果。
clcclear?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请点击下方选择您需要的文档下载。
以上为《基于遗传算法修正的BP神经网络算法》的无排版文字预览,完整格式请下载
下载前请仔细阅读上面文字预览以及下方图片预览。图片预览是什么样的,下载的文档就是什么样的。