《GA优化BP网络代码.docx》由会员分享,可在线阅读,更多相关《GA优化BP网络代码.docx(9页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、根据他人的代码,稍微改进后,并附上个人对代码的理解情况。采用遗传算法(GA)对BP网络的权值进行优化。其思路如下:(1)根据BP的输入值和目标值,确定好BP网络的输入层单元数、隐层单元数(本例只处理1个隐层的情况;多个隐层的方法类似,主要是在构造GA种群基因时有所差异)、以及输出层的单元个数。(2)根据BP网络的各层单元数来确定其输入层与隐层之间的权值w12,和隐层输出值b1,以及隐层到输出层的权值w23,和输出层输出b2。这四个值各个元素的组合就组成了一个基因,即根据他们来确定基因长度。这一步非常重要!可根据以下代码进行理解。 % 权值矩阵分配 % 输入到隐层用w_he表示,3x4,3表示输
2、入层个数,4表示输出层个数% w_he=chrom(i,1) chrom(i,5) chrom(i,9) chrom(i,13);% chrom(i,2) chrom(i,6) chrom(i,10) chrom(i,14);% chrom(i,3) chrom(i,7) chrom(i,11) chrom(i,15);%以下for循环的作用是将某个基因,分别转换为bp网络所对应的权值或输出值。% 其中chrom(i,:)表示第i个基因的所有元素% in_num表述输入层单元个数% n表示基本的元素个数% w_he表示输入层到输出层权值;w_out表示因此到输出层的权值% b_he表示隐层输出
3、向量;b_out表示输出层的输出向量。 for j=1:n w_he(:,j)=chrom(i,(j-1)*(in_num+1)+1:j*(in_num+1)-1); w_out(j)=chrom(i,(in_num+1)*n+j); b_he(j)=chrom(i,(in_num+1)*j); end b_out=chrom(i,len); % 隐层到输出层用w_out表示,4x1% w_out=chrom(i,17) chrom(i,18) chrom(i,19) chrom(i,20);% b_he=chrom(i,4) chrom(i,8) chrom(i,12) chrom(i,16
4、);% b_out=chrom(i,21); (3)确定好权值与基因的对应关系后。利用GA对BP网络权值进行优化,也即寻找GA中最佳的适应度的基因。适应度函数则是利用BP网络构造,即把基因转换成bp权值,再输入样本值查看其误差大小。(4)寻找最优基因就是GA的基本步骤,选择、交叉、变异,这里就不详述了。下面附上代码。如果看懂了代码,请根据自己的需要进行调整,以达到最佳效果。按照GA流程来看代码,真的很简单!通过调用此函数即可实现其训练BP_GA(p,aim,n)function net=BP_GA(p,aim,n)% p,训练样本列向量矩阵% aim,目标值列向量% n隐层单元个数% 源程序为
5、仿真西北师范大学学报的遗传主程序 %计算的染色体均方误差 fitness=8/sum(error.2)% 经过简单改造% ticPopsize=100;%种群规模P_mutation=0.1;%变异系数P_cross=0.6;% 交叉系数m=2; %权值和阈值的初始化范围% p= 0 0 0 0 1 1 1 1;% 0 0 1 1 0 0 1 1;% 1 0 1 0 1 0 1 0; %输入值% aim=0 1 1 0 1 0 0 1; % 输出值num=size(p,1)*n+2*n+1;chrom=2*m.*rand(Popsize,num)-m; % 产生初始种群 40x21矩阵,范围【
6、-m,m】% temchrom=zeros(size(chrom);ecope=100;% 迭代次数currentbest=zeros(ecope,num);% 每一步迭代的最优数组currentbest_value=zeros(ecope,1);fitness_gene=fitness(chrom,p,aim,n);%计算的染色体均方误差 fitness=8/sum(error.2) c_value c_order=max(fitness_gene); for k=1:ecope %保留当前最好染色体 c_value c_order=max(fitness_gene); currentbes
7、t(k,:)=chrom(c_order,:); currentbest_value(k)=c_value; % 选择过程 fit=cumsum(fitness_gene)/sum(fitness_gene); N=Popsize; s=select(fit,N); temchrom=chrom(s,:);% 将选择的储存到临时变量中 %交叉 P=rand(1,N); prob=find(PP_cross); crosschrom=temchrom(prob,:);% 从临时变量中选择部分进行交叉 crosschrom=cross_over(crosschrom); temchrom(prob
8、,:)=crosschrom;%临时变量中只有部分进行了交叉 %变异 temchrom=mutation(temchrom,P_mutation); chrom=temchrom; % 计算交叉变异之后的染色体的适应度 fitness_gene=fitness(chrom,p,aim,n); fit=cumsum(fitness_gene)/sum(fitness_gene); N=Popsize; s=select(fit,N-1); s_value s_order=max(fitness_gene); if s_valuecurrentbest_value(k) %精因选择 chrom=c
9、hrom(s,:);currentbest(k,:); fitness_gene=fitness_gene(s);currentbest_value(k); else s=s s_order(1); chrom=chrom(s,:); fitness_gene=fitness_gene(s); endendi=100;in_num=size(p,1); for j=1:n w_he(:,j)=currentbest(i,(j-1)*(in_num+1)+1:j*(in_num+1)-1); w_out(j)=currentbest(i,(in_num+1)*n+j); b_he(j)=curr
10、entbest(i,(in_num+1)*j); end samples=size(p,2); b_out=currentbest(i,num); out=zeros(size(aim);for j=1:size(p,2) for s=1:n % 隐层的输入与输出 in_he(s)=sum(w_he(:,s).*p(:,j)+b_he(s);%隐层的输入 out_he(s)=(1-exp(in_he(s)/(1+exp(in_he(s); %隐层的输出 end % 输出层的输入与输出 in_out=w_out*out_he+b_out; out_out=1/(1+exp(-in_out); o
11、ut(j)=out_out;endnet=currentbest(ecope,:);% figure% plot(aim,-o)% hold on% plot(out,r-*)end %图表显示% i=1:k;% y=1./currentbest_value(1:k,:);% % plot(i,y,r:);% title( sum root mean square error);% % toc% y(k) function y=fitness(chrom,p,aim,n)% global P_cross P_mutation% chrom,基因种群矩阵% p,样本矩阵% aim,目标矩阵,暂时
12、只支持向量,即网络输出层只有一个单元% n,隐层的单元个数Popsize len=size(chrom);in_num,samples=size(p);%样本数fitness_gene=zeros(Popsize,1);in_he=zeros(n,1);out_he=zeros(n,1);in_out=0;out_out=0;w_he=zeros(in_num,n);% 3x4w_out=zeros(1,n);% 1x4b_he=zeros(1,n);% b_out=zeros(1,1);% 权值和阈值的分配设置for i=1:Popsize % 权值矩阵分配 % 输入到隐层用w_he表示,3
13、x4,3表示输入层个数,4表示输出层个数% w_he=chrom(i,1) chrom(i,5) chrom(i,9) chrom(i,13);% chrom(i,2) chrom(i,6) chrom(i,10) chrom(i,14);% chrom(i,3) chrom(i,7) chrom(i,11) chrom(i,15); for j=1:n w_he(:,j)=chrom(i,(j-1)*(in_num+1)+1:j*(in_num+1)-1); w_out(j)=chrom(i,(in_num+1)*n+j); b_he(j)=chrom(i,(in_num+1)*j); en
14、d b_out=chrom(i,len); % 隐层到输出层用w_out表示,4x1% w_out=chrom(i,17) chrom(i,18) chrom(i,19) chrom(i,20);% b_he=chrom(i,4) chrom(i,8) chrom(i,12) chrom(i,16);% b_out=chrom(i,21); error=zeros(samples,1); for j=1:samples for s=1:n % 隐层的输入与输出 in_he(s)=sum(w_he(:,s).*p(:,j)+b_he(s);%隐层的输入 out_he(s)=(1-exp(in_h
15、e(s)/(1+exp(in_he(s); %隐层的输出 end % 输出层的输入与输出 in_out=w_out*out_he+b_out; out_out=1/(1+exp(-in_out); % 计算各个样本误差 error(j)=aim(j)-out_out; end fitness_gene(i)=samples/sum(error.2); % 染色体均方误差 % 误差越小,fitness_gene越大end y=fitness_gene;function y=cross_over(chrom)% m,n=size(chrom);% temchrom=zeros(1,n);% for
16、 i=1:2:m-1% % c=rand(1);% % temchrom=chrom(i,:);% % chrom(i,:)=c.*chrom(i,:)+(1-c).*chrom(i+1,:);% % chrom(i+1,:)=(1-c).*temchrom+c.*chrom(i+1,:);% c=rand(1);% temchrom=chrom(i,:);% chrom(i,:)=c.*chrom(i,:)+(1-c).*chrom(i+1,:);% chrom(i+1,:)=(1-c).*temchrom+c.*chrom(i+1,:);% end% y=chrom;m,n=size(ch
17、rom); %两点交叉for i=1:2:m-1 c=1+fix(n*rand(1,2); c_a=min(c); c_b=max(c); % 第i个与第i+1个交叉 temchrom=chrom(i,c_a:c_b); chrom(i,c_a:c_b)=chrom(i+1,c_a:c_b); chrom(i+1,c_a:c_b)=temchrom;endy=chrom;function y=mutation(chrom,P_mutation,m) %均匀变异if nargin=1 P_mutation=0.1;m=100;endif nargin=2 m=100;end% P=rand(Popsize,1);% n=find(PP_mutation);% len=length(n);% for i=1:len% d=fix(9*rand(1)+1;% x=4*rand(1)-2;% chrom(n(i),d)=x; % endP=rand(size(chrom);n=find(Pm% tem_a=m-rand;% elseif tem_a=P(i); s(i)=tem_p(1);endy=s;
限制150内