遗传算法优化BP神经网络

  • w9_759381
    了解作者
  • Python
    开发工具
  • 56.6KB
    文件大小
  • zip
    文件格式
  • 0
    收藏次数
  • VIP专享
    资源类型
  • 0
    下载次数
  • 2022-03-02 12:20
    上传日期
基于遗传算法优化的BP神经网络是科研中的常用方法,通过遗传算法优化初始神经网络的权值阈值,使模型更快收敛,同时降低陷入局部最优的可能,本资源代码中,只需更改加载数据,拿来即用。
基于遗传算法的BP神经网络.zip
  • 基于遗传算法的BP神经网络
  • Code.m
    195B
  • fun.asv
    970B
  • GA_BP.m
    3.7KB
  • Mutation.m
    1001B
  • data.mat
    45.3KB
  • data.m
    216B
  • Select.m
    780B
  • Cross.m
    888B
  • BPNN.m
    1KB
  • Cross.asv
    1.4KB
  • fun.m
    970B
内容介绍
clear; clc; load data.mat N=2000; %数据总个数 M=1900; %训练数据 %从1到N随机排序 k=rand(1,N); [m,n]=sort(k); inputnum=2;%输入层个数 hiddennum=5;%隐含层个数 outputnum=1;%输出层个数 %训练数据和预测数据 input_train=input(n(1:M),:)'; output_train=output(n(1:M),:)'; input_test=input(n((M+1):N),:)'; output_test=output(n((M+1):N),:)'; %训练样本输入输出数据归一化 [inputn,inputps]=mapminmax(input_train); [outputn,outputps]=mapminmax(output_train); net=newff(inputn,outputn,hiddennum); maxgen=50; %进化代数 sizepop=20; %种群规模 pcross=[0.8]; %交叉概率 pmutation=[0.1]; %变异概率 numsum=inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum;%节点总数 lenchrom=ones(1,numsum);%个体长度 bound=[-3*ones(numsum,1) 3*ones(numsum,1)];%数据范围[-3 3] individuals=struct('fitness',zeros(1,sizepop), 'chrom',[]);%将种群信息定义为一个结构体 avgfitness=[];%平均适应度 bestfitness=[];%最佳适应度 bestchrom=[];%适应度最好的个体 for i=1:sizepop %随机产生一个种群 individuals.chrom(i,:)=Code(lenchrom,bound); x=individuals.chrom(i,:); %计算适应度 individuals.fitness(i)=fun(x,inputnum,hiddennum,outputnum,net,inputn,outputn); %染色体的适应度 end [bestfitness bestindex]=min(individuals.fitness);%找最好的染色体 bestchrom=individuals.chrom(bestindex,:); %最好的染色体 avgfitness=sum(individuals.fitness)/sizepop; %染色体的平均适应度 trace=[avgfitness bestfitness];% 记录每一代进化中最好的适应度和平均适应度 for i=1:maxgen %选择 individuals=Select(individuals,sizepop); avgfitness=sum(individuals.fitness)/sizepop; %交叉 individuals.chrom=Cross(pcross,lenchrom,individuals.chrom,sizepop,bound); %变异 individuals.chrom=Mutation(pmutation,lenchrom,individuals.chrom,sizepop,i,maxgen,bound); %计算适应度 for j=1:sizepop x=individuals.chrom(j,:); individuals.fitness(j)=fun(x,inputnum,hiddennum,outputnum,net,inputn,outputn); end %找到最小和最大适应度的染色体及它们在种群中的位置 [newbestfitness,newbestindex]=min(individuals.fitness); [worestfitness,worestindex]=max(individuals.fitness); % 代替上一次进化中最好的个体 if bestfitness>newbestfitness bestfitness=newbestfitness; bestchrom=individuals.chrom(newbestindex,:); end individuals.chrom(worestindex,:)=bestchrom; individuals.fitness(worestindex)=bestfitness; avgfitness=sum(individuals.fitness)/sizepop; trace=[trace;avgfitness bestfitness]; %记录每一代进化中最好的适应度和平均适应度 end figure(1); [r c]=size(trace); subplot(1,2,1); plot([1:r]',trace(:,1),'b--'); title(['适应度曲线 ' '终止代数=' num2str(maxgen)]); xlabel('进化代数');ylabel('平均适应度'); subplot(1,2,2); plot([1:r]',trace(:,2),'r*'); title(['适应度曲线 ' '终止代数=' num2str(maxgen)]); xlabel('进化代数');ylabel('最佳适应度'); % 把遗传算法得到的最优个体x赋给BP神经网络权值和阈值 x=bestchrom; w1=x(1:inputnum*hiddennum); B1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum); w2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum); B2=x(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+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}=B2; net.trainParam.epochs=100; net.trainParam.lr=0.1; net.trainParam.goal=0.00001; [net,per2]=train(net,inputn,outputn); inputn_test=mapminmax('apply',input_test,inputps); an=sim(net,inputn_test); test_simu=mapminmax('reverse',an,outputps); error=test_simu-output_test; figure(2); plot(error); title('优化后的误差');
评论