Hello Mat

 找回密码
 立即注册
查看: 6831|回复: 0

遗传算法GA优化的BP神经网络

[复制链接]

1323

主题

1551

帖子

0

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22647
发表于 2017-6-8 21:28:10 | 显示全部楼层 |阅读模式
遗传算法GA优化的BP神经网络
百度网盘链接:
链接:http://pan.baidu.com/s/1qYfRBPU

具体链接在halcom.cn论坛,联系人QQ:3283892722
该论坛是一个学习交流平台,我会逐一的和大家分享学习。
欢迎大家录制视频,并提交给我,我来设置视频,你可在论坛进行打赏分享。
视频专用播放器:http://halcom.cn/forum.php?mod=viewthread&tid=258&extra=page%3D1

参考:http://halcom.cn/forum.php?mod=viewthread&tid=280
GA_BP代码如下
  1. %% 清空环境变量
  2. clc,clear,close all
  3. %% 训练数据预测数据提取及归一化
  4. %下载输入输出数据
  5. load data.mat; %原始数据以列向量的方式存放在workplace文件中
  6. n=size(data);
  7. input=data(:,1:3);%作为输入
  8. output=data(:,4);%作为目标向量
  9. %节点个数
  10. inputnum=3;
  11. hiddennum=7;
  12. outputnum=1;

  13. %训练数据和预测数据
  14. input_train=input(1:n(1,1),:)';
  15. input_test=input(1:n(1,1),:)';
  16. output_train=output(1:n(1,1))';
  17. output_test=output(1:n(1,1))';

  18. %选连样本输入输出数据归一化
  19. [inputn,inputps]=mapminmax(input_train);
  20. [outputn,outputps]=mapminmax(output_train);

  21. %构建网络
  22. nntwarn off
  23. net=newff(inputn,outputn,hiddennum);

  24. %% 遗传算法参数初始化
  25. maxgen=10;                         %进化代数,即迭代次数
  26. sizepop=50;                        %种群规模
  27. pcross=[0.3];                       %交叉概率选择,0和1之间
  28. pmutation=[0.1];                    %变异概率选择,0和1之间

  29. %节点总数
  30. numsum=inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum;

  31. lenchrom=ones(1,numsum);        
  32. bound=[-3*ones(numsum,1) 3*ones(numsum,1)];    %数据范围

  33. %------------------------------------------------------种群初始化--------------------------------------------------------
  34. individuals=struct('fitness',zeros(1,sizepop), 'chrom',[]);  %将种群信息定义为一个结构体
  35. avgfitness=[];                      %每一代种群的平均适应度
  36. bestfitness=[];                     %每一代种群的最佳适应度
  37. bestchrom=[];                       %适应度最好的染色体
  38. %初始化种群
  39. for i=1:sizepop
  40.     %随机产生一个种群
  41.     individuals.chrom(i,:)=Code(lenchrom,bound);    %编码(binary和grey的编码结果为一个实数,float的编码结果为一个实数向量)
  42.     x=individuals.chrom(i,:);
  43.     %计算适应度
  44.     individuals.fitness(i)=fun(x,inputnum,hiddennum,outputnum,net,inputn,outputn);   %染色体的适应度
  45. end

  46. %找最好的染色体
  47. [bestfitness bestindex]=min(individuals.fitness);
  48. bestchrom=individuals.chrom(bestindex,:);  %最好的染色体
  49. avgfitness=sum(individuals.fitness)/sizepop; %染色体的平均适应度
  50. % 记录每一代进化中最好的适应度和平均适应度
  51. trace=[avgfitness bestfitness];

  52. %% 迭代求解最佳初始阀值和权值
  53. % 进化开始
  54. for i=1:maxgen
  55.     i
  56.     % 选择
  57.     individuals=Select(individuals,sizepop);
  58.     avgfitness=sum(individuals.fitness)/sizepop;
  59.     %交叉
  60.     individuals.chrom=Cross(pcross,lenchrom,individuals.chrom,sizepop,bound);
  61.     % 变异
  62.     individuals.chrom=Mutation(pmutation,lenchrom,individuals.chrom,sizepop,i,maxgen,bound);
  63.    
  64.     % 计算适应度
  65.     for j=1:sizepop
  66.         x=individuals.chrom(j,:); %解码
  67.         individuals.fitness(j)=fun(x,inputnum,hiddennum,outputnum,net,inputn,outputn);   
  68.     end
  69.    
  70.   %找到最小和最大适应度的染色体及它们在种群中的位置
  71.     [newbestfitness,newbestindex]=min(individuals.fitness);
  72.     [worestfitness,worestindex]=max(individuals.fitness);
  73.     % 代替上一次进化中最好的染色体
  74.     if bestfitness>newbestfitness
  75.         bestfitness=newbestfitness;
  76.         bestchrom=individuals.chrom(newbestindex,:);
  77.     end
  78.     individuals.chrom(worestindex,:)=bestchrom;
  79.     individuals.fitness(worestindex)=bestfitness;
  80.    
  81.     avgfitness=sum(individuals.fitness)/sizepop;
  82.    
  83.     trace=[trace;avgfitness bestfitness]; %记录每一代进化中最好的适应度和平均适应度

  84. end
  85. %% 遗传算法结果分析
  86. figure,
  87. [r c]=size(trace);
  88. plot([1:r]',trace(:,2),'b--');
  89. title(['适应度曲线  ' '终止代数=' num2str(maxgen)]);
  90. xlabel('进化代数');ylabel('适应度');
  91. legend('平均适应度','最佳适应度');
  92. disp('适应度                   变量');
  93. x=bestchrom;

  94. %% 把最优初始阀值权值赋予网络预测
  95. % %用遗传算法优化的BP网络进行值预测
  96. w1=x(1:inputnum*hiddennum);
  97. B1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);
  98. w2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
  99. B2=x(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);

  100. net.iw{1,1}=reshape(w1,hiddennum,inputnum);
  101. net.lw{2,1}=reshape(w2,outputnum,hiddennum);
  102. net.b{1}=reshape(B1,hiddennum,1);
  103. net.b{2}=B2;

  104. %% BP网络训练
  105. %网络进化参数
  106. net.trainParam.epochs=100;
  107. net.trainParam.lr=0.1;
  108. %net.trainParam.goal=0.00001;

  109. %网络训练
  110. [net,per2]=train(net,inputn,outputn);

  111. %% BP网络预测
  112. %数据归一化
  113. inputn_test=mapminmax('apply',input_test,inputps);
  114. an=sim(net,inputn_test);
  115. test_simu=mapminmax('reverse',an,outputps);
  116. error=test_simu-output_test;

  117. %% 结果分析
  118. figure,
  119. plot(test_simu,':og')%预测值
  120. hold on
  121. plot(output_test,'-*');%实际值
  122. error=test_simu-output_test;
  123. plot(error,'-r');
  124. legend('预测输出','期望输出','BP网络预测误差')
  125. title('BP网络预测输出','fontsize',12)
  126. ylabel('函数输出','fontsize',12)
  127. xlabel('样本','fontsize',12)

  128. %预测误差
  129. figure,
  130. plot((output_test-test_simu)./test_simu,'-*');
  131. title('神经网络预测误差百分比')
  132. disp '误差累积和'
  133. errorsum=sum(abs(error))
复制代码
适应度函数:
  1. function error = fun(x,inputnum,hiddennum,outputnum,net,inputn,outputn)
  2. %该函数用来计算适应度值
  3. %x          input     个体
  4. %inputnum   input     输入层节点数
  5. %outputnum  input     隐含层节点数
  6. %net        input     网络
  7. %inputn     input     训练输入数据
  8. %outputn    input     训练输出数据

  9. %error      output    个体适应度值

  10. %提取
  11. w1=x(1:inputnum*hiddennum);
  12. B1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);
  13. w2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
  14. B2=x(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);

  15. /*
  16. net=newff(inputn,outputn,hiddennum);         
  17. %网络进化参数
  18. net.trainParam.epochs=20;
  19. net.trainParam.lr=0.1;
  20. net.trainParam.goal=0.00001;
  21. net.trainParam.show=100;
  22. net.trainParam.showWindow=0;
  23. */  去掉

  24. %网络权值赋值
  25. net.iw{1,1}=reshape(w1,hiddennum,inputnum);
  26. net.lw{2,1}=reshape(w2,outputnum,hiddennum);
  27. net.b{1}=reshape(B1,hiddennum,1);
  28. net.b{2}=B2;

  29. %网络训练
  30. net=train(net,inputn,outputn);

  31. an=sim(net,inputn);

  32. error=sum(abs(an-outputn));
复制代码
注意:
(1)【/* net=newff(inputn,outputn,hiddennum)  */的使用】
(2)选择、交叉、变异算子,见GA函数优化分析代码。
(3)缺陷:现有的代码大多数是70%的训练样本,30%的测试样本。
(4)改进策略:BP神经网络应该组成70%的训练样本,15%的验证样本,15%的测试样本。

参考:http://halcom.cn/forum.php?mod=viewthread&tid=262&extra=page%3D2





算法QQ  3283892722
群智能算法链接http://halcom.cn/forum.php?mod=forumdisplay&fid=73
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Python|Opencv|MATLAB|Halcom.cn ( 蜀ICP备16027072号 )

GMT+8, 2024-11-22 21:48 , Processed in 0.256104 second(s), 25 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表