Hello Mat

 找回密码
 立即注册
查看: 9899|回复: 1

9-改进ABC算法优化的BP神经网络

[复制链接]

1294

主题

1520

帖子

110

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22633
发表于 2017-9-12 22:16:56 | 显示全部楼层 |阅读模式
9-改进ABC算法优化的BP神经网络:
百度网盘链接:http://pan.baidu.com/s/1nvwYsIX
程序分享链接:http://pan.baidu.com/s/1nuCrjFb

参考链接:
【2】遗传算法GA优化的BP神经网络7-改进的GA算法优化的BP神经网络+寻找最优条件--MATLAB视频
19基于人工蜂群ABC算法的函数优化分析 + (PPT+参考文献) + 源程序

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

视频内容:
(1)BP网络的图像分类
(2)GA优化的BP网络的图像分类
(3)ABC优化的BP网络的图像分类
改进点:
(1)以验证样本的预测误差作为适应度值;
(2)将ABC种群作为BP网络的初始解,经过BP网络train后得到新的权值和阈值,将权值和阈值反向赋值给ABC种群;
  1. function [error, x_iter] = fun_ABC_Improved(x,inputnum,hiddennum,outputnum,net,inputn,outputn,inputn_test,outputn_test)
  2. % 该函数用来计算适应度值
  3. % 输入:
  4. %           x          input     个体
  5. %           inputnum   input     输入层节点数
  6. %           outputnum  input     隐含层节点数
  7. %           net        input     网络
  8. %           inputn     input     训练输入数据
  9. %           outputn    input     训练输出数据
  10. % 输出:
  11. %           error      output    个体适应度值

  12. % 提取 阈值和权值
  13. w1=x(1:inputnum*hiddennum);
  14. B1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);
  15. w2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
  16. B2=x(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);
  17. % net=newff(inputn,outputn,hiddennum);

  18. % 网络进化参数
  19. % net.trainParam.epochs=500;
  20. % net.trainParam.lr=0.01;
  21. % net.trainParam.goal=0.0001;
  22. % net.trainParam.show=100;
  23. % net.trainParam.showWindow=0;
  24. % net.trainParam.max_fail=200;

  25. % 网络权值、阈值赋值
  26. net.iw{1,1}=reshape(w1,hiddennum,inputnum);
  27. net.lw{2,1}=reshape(w2,outputnum,hiddennum);
  28. net.b{1}=reshape(B1,hiddennum,1);
  29. net.b{2}=reshape(B2,outputnum,1);
  30. % 网络训练
  31. net=train(net,inputn,outputn);
  32. % an=sim(net,inputn);
  33. % error=sum(sum(abs(an-outputn)));
  34. % error = mse(abs(an-outputn));
  35. an=sim(net,inputn_test);
  36. error = mse(abs(an-outputn_test));

  37. x=[];
  38. w1=[];
  39. B1=[];
  40. w2=[];
  41. B2=[];
  42. % 反向取值
  43. w1 = net.iw{1,1};
  44. B1 = net.b{1};
  45. w2 = net.lw{2,1};
  46. B2 = net.b{2};
  47. w11 = reshape(w1,1, hiddennum*inputnum);
  48. w22 = reshape(w2,1, outputnum*hiddennum);
  49. x_iter = [];
  50. x_iter(1:inputnum*hiddennum) = w11;
  51. x_iter(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum) = B1;
  52. x_iter(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum) = w22;
  53. x_iter(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum) = B2;
复制代码







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

使用道具 举报

1294

主题

1520

帖子

110

金钱

管理员

Rank: 9Rank: 9Rank: 9

积分
22633
 楼主| 发表于 2019-10-28 21:44:11 | 显示全部楼层
一个将人工蜂群算法优化的BP神经网络封装为一个函数的代码,具体如下:
  1. %% 人工蜂群算法优化的BP神经网络
  2. function [net,w1,B1,w2,B2,per]=...
  3.     ABC_BP_Fun(inputn,outputn, inputnum,hiddennum,outputnum )
  4. % 初始化网络结构
  5. nntwarn off
  6. net=newff(inputn,outputn,hiddennum,{'logsig','tansig'},'trainlm');
  7. net.trainParam.epochs=50;
  8. net.trainParam.lr=0.01;
  9. net.trainParam.goal=1e-6;
  10. net.trainParam.min_grad = 1e-6;
  11. net.trainParam.show=50;
  12. net.trainParam.showWindow=0;
  13. net.trainParam.max_fail=20;
  14. %% ABC的算法参数
  15. popmin = -5;  % Lb
  16. popmax = 5;   % Ub
  17. nvar = inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum;  % 待求变量个数
  18. itermax = 50; % 迭代次数
  19. sizepop = 20; % 种群>=2
  20. trail(1:sizepop,1) = 0;     % 未找到更优解的迭代次数
  21. limit = sizepop;            % 拖尾最大次数
  22. %% 初始化种群
  23. for i=1:sizepop
  24.     pop(i,:) = popmin + (popmax-popmin).*rand(1,nvar);    % 实数编码
  25.     [fitness(i), pop(i,:)]= fun_ABC_Improved(pop(i,:),inputnum,hiddennum,outputnum,net,inputn,outputn,inputn,outputn);   % 目标函数值
  26. end
  27. [bestfitness,index] = min(fitness);     % 极小值
  28. zbest = pop(index,:);                   % 最佳个体
  29. fitnesszbest = bestfitness;             % 全局最优
  30. %% 迭代寻优
  31. for i=1:itermax
  32.     disp(['当前迭代次数:', num2str(i), ' ,  总的迭代次数:', num2str(itermax)])
  33.     % 采蜜峰开始工作
  34.     for j=1:sizepop
  35.         % 选择采蜜的个体
  36.         %         x2y = randi(nvar);   % nvar个未知数
  37.         Disordered = randperm(nvar);
  38.         x2y = Disordered(1:randi(nvar));   % nvar个未知数
  39.         % 选择相连的种群
  40.         neighbour = randi(sizepop);
  41.         while( neighbour==j  )
  42.             neighbour = randi(sizepop);
  43.         end
  44.         
  45.         % 种群更新(解)
  46.         tempx = pop(j,:);  % 当前的解
  47.         tempx(x2y) = pop(j,x2y) + (pop(j,x2y)-pop(neighbour,x2y))*(rand-0.5)*2;
  48.         %         tempx(x2y) = pop(j,x2y) + (pop(j,x2y)-pop(neighbour,x2y))*rand;
  49.         
  50.         % 越界限制
  51.         for ij = 1:nvar
  52.             if tempx(ij)>popmax
  53.                 tempx(ij)=popmax;
  54.             end
  55.             if tempx(ij)<popmin
  56.                 tempx(ij)=popmin;
  57.             end
  58.         end
  59.         
  60.         % 适应度更新
  61.         [temp_fitness, tempx]= fun_ABC_Improved( tempx, inputnum,hiddennum,outputnum,net,inputn,outputn,inputn,outputn );  % 当前的适应度函数值--目标函数值--最小目标函数值
  62.         % 比较  个体间比较
  63.         if temp_fitness<fitness(j)
  64.             fitness(j) = temp_fitness;
  65.             pop(j,:) = tempx;
  66.         end
  67.         if temp_fitness<bestfitness
  68.             bestfitness = temp_fitness;
  69.             zbest =  tempx;
  70.         end
  71.     end
  72.    
  73.     % 观察峰
  74.     % 计算概率
  75.     prob = 0.9*fitness./max(fitness) + 0.1;
  76.     for j=1:sizepop
  77.         if(rand<prob(j))
  78.             
  79.             % 选择采蜜的个体
  80.             %         x2y = randi(nvar);   % nvar个未知数
  81.             Disordered = randperm(nvar);
  82.             x2y = Disordered(1:randi(nvar));   % nvar个未知数
  83.             % 选择相连的种群
  84.             neighbour = randi(sizepop);
  85.             while( neighbour==j  )
  86.                 neighbour = randi(sizepop);
  87.             end
  88.             
  89.             % 种群更新(解)
  90.             tempx = pop(j,:);  % 当前的解
  91.             tempx(x2y) = pop(j,x2y) + (pop(j,x2y)-pop(neighbour,x2y))*(rand-0.5)*2;
  92.             %             tempx(x2y) = pop(j,x2y) + (pop(j,x2y)-pop(neighbour,x2y))*rand;
  93.             
  94.             % 越界限制
  95.             for ij = 1:nvar
  96.                 if tempx(ij)>popmax
  97.                     tempx(ij)=popmax;
  98.                 end
  99.                 if tempx(ij)<popmin
  100.                     tempx(ij)=popmin;
  101.                 end
  102.             end
  103.             
  104.             % 适应度更新
  105.             [temp_fitness, tempx]= fun_ABC_Improved( tempx, inputnum,hiddennum,outputnum,net,inputn,outputn,inputn,outputn );  % 当前的适应度函数值--目标函数值--最小目标函数值
  106.             % 比较  个体间比较
  107.             if temp_fitness<fitness(j)
  108.                 fitness(j) = temp_fitness;
  109.                 pop(j,:) = tempx;
  110.             end
  111.             if temp_fitness<bestfitness
  112.                 bestfitness = temp_fitness;
  113.                 zbest =  tempx;
  114.             else
  115.                 trail(j) = trail(j)+1;
  116.             end
  117.         end
  118.     end
  119.    
  120.     % 侦察峰开始工作
  121.     [maxTrial, index] = max(trail);
  122.     index = index(1);
  123.     if(maxTrial(1)>limit)
  124.         pop(index,:) =  popmin + (popmax-popmin).*rand(1,nvar);
  125.         [fitness(index), pop(index,:)]= fun_ABC_Improved( pop(index,:), inputnum,hiddennum,outputnum,net,inputn,outputn,inputn,outputn );  % 适应度函数值--目标函数值--最小目标函数值
  126.     end
  127.    
  128.     fitness_iter(i) = bestfitness;
  129. end
  130. % figure,
  131. % plot(fitness_iter,'ro-','linewidth',2)
  132. % xlabel('迭代次数'); ylabel('适应度值--验证样本均方根误差')
  133. % time = toc
  134. % disp(['最优解   ', num2str(zbest)] )
  135. %% 将最优个体zbest代入BP神经网络进行训练预测
  136. [net,w1,B1,w2,B2,per] = netfun(zbest,inputnum,hiddennum,outputnum,net,inputn,outputn);

  137. % figure(55)
  138. % semilogy(per.perf,'b.-');
  139. % xlabel('迭代次数'); ylabel('均方差mse');
  140. % hold off

  141. %% BP网络预测
  142. % 训练样本--预测输出
  143. % yc_train = sim(net,inputn);
  144. % error_train = abs(yc_train-outputn);
  145. % disp(['训练样本均方根误差 = ',num2str(mse(error_train))])
  146. % train_simu=mapminmax('reverse',yc_train,outputps);
  147. %
  148. % % 验证样本--预测输出
  149. % yc_test = sim(net,inputn_test);
  150. % error_test = abs(yc_test-outputn_test);
  151. % disp(['验证样本均方根误差 = ',num2str(mse(error_test))])
  152. % test_simu=mapminmax('reverse',yc_test,outputps);
  153. %
  154. % save ABC_BP_pop.mat pop fitness
  155. % %% 显示显示
  156. % figure(1)
  157. % plot(output_train,'r.-');
  158. % hold on
  159. % plot(train_simu,'b.-');
  160. % legend('训练样本--实际值','训练样本--BP预测值')
  161. % xlabel('样本数'); ylabel('采暖季热负荷指标W/m2(输出值)');
  162. % hold off
  163. %
  164. % figure(2)
  165. % plot(error_train,'r.-');
  166. % xlabel('样本数'); ylabel('采暖季热负荷指标W/m2--误差值');
  167. % hold off
  168. %
  169. % figure(3)
  170. % plot(output_test,'r.-');
  171. % hold on
  172. % plot(test_simu,'b.-');
  173. % legend('测试样本--实际值','测试样本--BP预测值')
  174. % xlabel('样本数'); ylabel('采暖季热负荷指标W/m2(输出值)');
  175. % hold off
  176. %
  177. % figure(4)
  178. % plot(error_test,'r.-');
  179. % xlabel('样本数'); ylabel('采暖季热负荷指标W/m2--误差值');
  180. % hold off
复制代码
适应度函数如下:
  1. function [error, x_iter] = fun_ABC_Improved(x,inputnum,hiddennum,outputnum,net,inputn,outputn,inputn_test,outputn_test)
  2. % 该函数用来计算适应度值
  3. % 输入:
  4. %           x          input     个体
  5. %           inputnum   input     输入层节点数
  6. %           outputnum  input     隐含层节点数
  7. %           net        input     网络
  8. %           inputn     input     训练输入数据
  9. %           outputn    input     训练输出数据
  10. % 输出:
  11. %           error      output    个体适应度值

  12. % 提取 阈值和权值
  13. w1=x(1:inputnum*hiddennum);
  14. B1=x(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum);
  15. w2=x(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum);
  16. B2=x(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum);
  17. % net=newff(inputn,outputn,hiddennum);

  18. % 网络进化参数
  19. % net.trainParam.epochs=500;
  20. % net.trainParam.lr=0.01;
  21. % net.trainParam.goal=0.0001;
  22. % net.trainParam.show=100;
  23. % net.trainParam.showWindow=0;
  24. % net.trainParam.max_fail=200;

  25. % 网络权值、阈值赋值
  26. net.iw{1,1}=reshape(w1,hiddennum,inputnum);
  27. net.lw{2,1}=reshape(w2,outputnum,hiddennum);
  28. net.b{1}=reshape(B1,hiddennum,1);
  29. net.b{2}=reshape(B2,outputnum,1);
  30. % 网络训练
  31. net=train(net,inputn,outputn);
  32. % an=sim(net,inputn);
  33. % error=sum(sum(abs(an-outputn)));
  34. % error = mse(abs(an-outputn));
  35. an=sim(net,inputn_test);
  36. error = sum(sum(abs(an-outputn_test)));

  37. x=[];
  38. w1=[];
  39. B1=[];
  40. w2=[];
  41. B2=[];
  42. % 反向取值
  43. w1 = net.iw{1,1};
  44. B1 = net.b{1};
  45. w2 = net.lw{2,1};
  46. B2 = net.b{2};
  47. w11 = reshape(w1,1, hiddennum*inputnum);
  48. w22 = reshape(w2,1, outputnum*hiddennum);
  49. x_iter = [];
  50. x_iter(1:inputnum*hiddennum) = w11;
  51. x_iter(inputnum*hiddennum+1:inputnum*hiddennum+hiddennum) = B1;
  52. x_iter(inputnum*hiddennum+hiddennum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum) = w22;
  53. x_iter(inputnum*hiddennum+hiddennum+hiddennum*outputnum+1:inputnum*hiddennum+hiddennum+hiddennum*outputnum+outputnum) = B2;
复制代码





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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 18:02 , Processed in 0.203373 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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