声振论坛

 找回密码
 我要加入

QQ登录

只需一步,快速开始

声振论坛 展示 基础理论 查看内容

用遗传算法优化BP神经网络的Matlab编程实例(转)

2011-4-1 07:55| 发布者: 雪缘| 查看: 7035| 评论: 0

摘要: 由于BP网络的权值优化是一个无约束优化问题,而且权值要采用实数编码,所以直接利用Matlab遗传算法工具箱。以下贴出的代码是为一个19输入变量,1个输出变量情况下的非线性回归而设计的,如果要应用于其它情况,只需改 ...
由于BP网络的权值优化是一个无约束优化问题,而且权值要采用实数编码,所以直接利用Matlab遗传算法工具箱。以下贴出的代码是为一个19输入变量,1个输出变量情况下的非线性回归而设计的,如果要应用于其它情况,只需改动编解码函数即可。
  1. 程序一:GA训练BP权值的主函数
  2. function net=GABPNET(XX,YY)
  3. %--------------------------------------------------------------------------
  4. %  GABPNET.m
  5. %  使用遗传算法对BP网络权值阈值进行优化,再用BP算法训练网络
  6. %--------------------------------------------------------------------------
  7. %数据归一化预处理
  8. nntwarn off
  9. XX=premnmx(XX);
  10. YY=premnmx(YY);
  11. %创建网络
  12. net=newff(minmax(XX),[19,25,1],{'tansig','tansig','purelin'},'trainlm');
  13. %下面使用遗传算法对网络进行优化
  14. P=XX;
  15. T=YY;
  16. R=size(P,1);
  17. S2=size(T,1);
  18. S1=25;%隐含层节点数
  19. S=R*S1+S1*S2+S1+S2;%遗传算法编码长度
  20. aa=ones(S,1)*[-1,1];
  21. popu=50;%种群规模
  22. initPpp=initializega(popu,aa,'gabpEval');%初始化种群
  23. gen=100;%遗传代数
  24. %下面调用gaot工具箱,其中目标函数定义为gabpEval
  25. [x,endPop,bPop,trace]=ga(aa,'gabpEval',[],initPpp,[1e-6 1 1],'maxGenTerm',gen,...
  26.   'normGeomSelect',[0.09],['arithXover'],[2],'nonUnifMutation',[2 gen 3]);
  27. %绘收敛曲线图
  28. figure(1)
  29. plot(trace(:,1),1./trace(:,3),'r-');
  30. hold on
  31. plot(trace(:,1),1./trace(:,2),'b-');
  32. xlabel('Generation');
  33. ylabel('Sum-Squared Error');
  34. figure(2)
  35. plot(trace(:,1),trace(:,3),'r-');
  36. hold on
  37. plot(trace(:,1),trace(:,2),'b-');
  38. xlabel('Generation');
  39. ylabel('Fittness');
  40. %下面将初步得到的权值矩阵赋给尚未开始训练的BP网络
  41. [W1,B1,W2,B2,P,T,A1,A2,SE,val]=gadecod(x);
  42. net.LW{2,1}=W1;
  43. net.LW{3,2}=W2;
  44. net.b{2,1}=B1;
  45. net.b{3,1}=B2;
  46. XX=P;
  47. YY=T;
  48. %设置训练参数
  49. net.trainParam.show=1;
  50. net.trainParam.lr=1;
  51. net.trainParam.epochs=50;
  52. net.trainParam.goal=0.001;
  53. %训练网络
  54. net=train(net,XX,YY);


  55. 程序二:适应值函数
  56. function [sol, val] = gabpEval(sol,options)
  57. % val - the fittness of this individual
  58. % sol - the individual, returned to allow for Lamarckian evolution
  59. % options - [current_generation]
  60. load data2
  61. nntwarn off
  62. XX=premnmx(XX);
  63. YY=premnmx(YY);
  64. P=XX;
  65. T=YY;
  66. R=size(P,1);
  67. S2=size(T,1);
  68. S1=25;%隐含层节点数
  69. S=R*S1+S1*S2+S1+S2;%遗传算法编码长度
  70. for i=1:S,
  71.    x(i)=sol(i);
  72. end;
  73. [W1, B1, W2, B2, P, T, A1, A2, SE, val]=gadecod(x);

  74. 程序三:编解码函数
  75. function [W1, B1, W2, B2, P, T, A1, A2, SE, val]=gadecod(x)
  76. load data2
  77. nntwarn off
  78. XX=premnmx(XX);
  79. YY=premnmx(YY);
  80. P=XX;
  81. T=YY;
  82. R=size(P,1);
  83. S2=size(T,1);
  84. S1=25;%隐含层节点数
  85. S=R*S1+S1*S2+S1+S2;%遗传算法编码长度
  86. % 前R*S1个编码为W1
  87. for i=1:S1,
  88.     for k=1:R,
  89.       W1(i,k)=x(R*(i-1)+k);
  90.     end
  91. end
  92. % 接着的S1*S2个编码(即第R*S1个后的编码)为W2
  93. for i=1:S2,
  94.    for k=1:S1,
  95.       W2(i,k)=x(S1*(i-1)+k+R*S1);
  96.    end
  97. end
  98. % 接着的S1个编码(即第R*S1+S1*S2个后的编码)为B1
  99. for i=1:S1,
  100.    B1(i,1)=x((R*S1+S1*S2)+i);
  101. end
  102. % 接着的S2个编码(即第R*S1+S1*S2+S1个后的编码)为B2
  103. for i=1:S2,
  104.    B2(i,1)=x((R*S1+S1*S2+S1)+i);
  105. end
  106. % 计算S1与S2层的输出
  107. A1=tansig(W1*P,B1);
  108. A2=purelin(W2*A1,B2);
  109. % 计算误差平方和
  110. SE=sumsqr(T-A2);
  111. val=1/SE; % 遗传算法的适应值
复制代码


上述程序需要调用gaot工具箱

来自:2nsoft.cn

本文内容由 frogfish 提供

最新评论

QQ|小黑屋|Archiver|手机版|联系我们|声振论坛

GMT+8, 2024-4-25 07:46 , Processed in 0.058810 second(s), 15 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

返回顶部