【MATLAB】PSO优化RBFNN程序(带注释)
来源:互联网 发布:人工神经网络算法实例 编辑:程序博客网 时间:2024/05/22 05:27
自网上下载的PSO优化RBFNN的程序,发现没有注释,搜了下也没搜到这个程序的解释,于是乎自己写了下,按照自己理解的意思写的,有些地方也没弄清楚,放在这与大家交流,有问题欢迎留言。
显示主程序:
clear allclose all%G为迭代次数,n为个体长度(包括12个参数),m为总群规模%w,c1,c2为粒子群算法中的参数G =700;n = 12;%个体长度,一个粒子的长度m = 20;w = 0.1;%惯性权重c1 = 2;c2 = 2;%设置粒子的最小位置与最大位置for i = 1:3 MinX(i) = 0.1*ones(1); MaxX(i) = 3*ones(1);endfor i = 4:1:9 MinX(i) = -3*ones(1); MaxX(i) = 3*ones(1);endfor i = 10:1:12 MinX(i) = -ones(1); MaxX(i) = ones(1);end%产生初始粒子位置pop = rands(m,n);%m:20个粒子。n:每个粒子可以设置12个值for i = 1:m%对超过范围的粒子,进行处理 for j = 1:3 if pop(i,j) < MinX(j) pop(i,j) = MinX(j); end if pop(i,j) > MaxX(j) pop(i,j) = MaxX(j); end end for j = 4:9 if pop(i,j) < MinX(j) pop(i,j) = MinX(j); end if pop(i,j) > MaxX(j) pop(i,j) = MaxX(j); end end for j = 10:12 if pop(i,j) < MinX(j) pop(i,j) = MinX(j); end if pop(i,j) > MaxX(j) pop(i,j) = MaxX(j); end endend %初始化速度V = 0.1*rands(m,n);%20行12列,每个粒子的每个值设置一个初始的速度,0,1为惯性权重BsJ = 0; %误差的和,函数的返回值,值越小,说明得到的权值效果越好。即适应度值,适应度函数为神经网络输出与期望输出的差值的总和%根据初始化的种群计算个体好坏,找出群体最优和个体最优for s = 1:m%粒子群规模 indivi = pop(s,:);%取一个粒子,为一个行向量 [indivi,BsJ] = chap10_3b(indivi,BsJ);%调用 Error(s) = BsJ;%将次粒子的误差和赋值end[OderEr,IndexEr] = sort(Error);%将Error数组按升序排列Error;Errorleast = OderEr(1);%将最小值赋值for i = 1:m%种群规模 if Errorleast == Error(i) gbest = pop(i,:);%将第i个粒子赋值给gbest,即全局最优位置 break; endendibest = pop;%个体极值for kg = 1:G%迭代次数 kg for s = 1:m;%种群规模%个体有4%的变异概率 for j = 1:n%粒子长度 for i = 1:m%种群规模,变异是针对某个粒子的某一个值的变异 if rand(1)<0.04 pop(i,j) = rands(1); end end end%r1,r2为粒子群算法参数 r1 = rand(1);%产生一个0-1之间的随机数 r2 = rand(1);%个体和速度更新 V(s,:) = w*V(s,:) + c1*r1*(ibest(s,:)-pop(s,:)) + c2*r2*(gbest-pop(s,:));%w为惯性权重 pop(s,:) = pop(s,:) + 0.3*V(s,:);%有些地方加速度那里的03也为0.5,感觉像乘以时间 %对更新的位置进行判断,超过设定的范围就处理下。粒子中不同的值对应不同的范围 for j = 1:3 if pop(s,j) < MinX(j) pop(s,j) = MinX(j); end if pop(s,j) > MaxX(j) pop(s,j) = MaxX(j); end end for j = 4:9 if pop(s,j) < MinX(j) pop(s,j) = MinX(j); end if pop(s,j) > MaxX(j) pop(s,j) = MaxX(j); end end for j = 10:12 if pop(s,j) < MinX(j) pop(s,j) = MinX(j); end if pop(s,j) > MaxX(j) pop(s,j) = MaxX(j); end end%求更新后的每个个体适应度值 [pop(s,:),BsJ] = chap10_3b(pop(s,:),BsJ);%输入为当前的粒子与上一个粒子对应的适应度值。输出为当前的粒子与当前粒子对应的适应度值 error(s) = BsJ;%将当前粒子对应的适应度值赋值给误差数组%根据适应度值对个体最优和群体最优进行更新 if error(s)<Error(s) ibest(s,:) = pop(s,:); Error(s) = error(s); end if error(s)<Errorleast gbest = pop(s,:); Errorleast = error(s); end end Best(kg) = Errorleast;endplot(Best);save pfile1 gbest;
函数:chap10_3b
%=======写在前面的注解===============%此函数相当于是神经网路的训练,而在粒子群算法中,相当于是每更新一次粒子(循环一次),就训练一回神经网络(给定的输入和输出不变,让神经网络预测)。所以粒子群迭代几次,就让神经网络训练几次。%RBF网络,由chap10_3a调用,返回值B为误差的和,和越小,说明得到的权值越好function [p,BsJ] = rbf_gaf(p,BsJ)ts = 0.001;alfa = 0.05;xite = 0.85;x = [0,0]';%网络的输入初值b = [p(1);p(2);p(3)];%各神经元的方差c = [p(4) p(5) p(6);%基函数的中心,若网络为两输入的话,那么每个神经元的中心也是两维的列向量 p(7) p(8) p(9)];w = [p(10);p(11);p(12)];%各神经元到输出的权值,网络为一输出w_1 = w;w_2 = w_1;c_1 = c;c_2 = c_1;b_1 = b;b_2 = b_1;y_1 = 0;for k = 1:1:400%这个时间的循环???? timef(k) = k*ts; %感觉这个值没什么用。 u(k) = sin(5*2*pi*k*ts); y(k) = u(k)^3 + y_1/(1 + y_1^2); %获得的是期望输出的值 x(1) = u(k);%将u(k)赋值给第一个输入 x(2) = y(k);%将y(k),即期望输出赋值给第二个人输入,为什么要这样赋值。。。 for j = 1:1:3%计算激活函数 h(j) = exp(-norm(x - c(:,j))^2/(2*b(j)*b(j)));%c与b代表的是各神经元中心与方差,h为神经元的激活函数 end ym(k) = w_1'*h';%权值与激活函数相乘 ,计算此次算出的输出,循环400此的话,一次训练产生400个输出。 e(k) = y(k) - ym(k);%计算每一次神经网络输出与期望输出的差值 d_w = 0*w;d_b = 0*b;d_c = 0*c;%乘以0全变为0,d_w,d_b,d_c三个值不造是干嘛的 for j = 1:1:3%计算d_w,d_b,d_c,但是没有找到这方面的公式。。。。 d_w(j) = xite*e(k)*h(j);%计算权值的增量,根据设置的参数,输出误差与激活函数 d_b(j) = xite*e(k)*w(j)*h(j)*(b(j)^-3)*norm(x-c(:,j))^2;%计算方差的增量,根据设置的参数,输出误差,此刻的权值、激活函数,此时的方差、此时的输入与中心的差值的二范数 for i = 1:1:2%计算中心的增量,根据设置的参数,此刻的权值、激活函数,输入与中心的差值,方差。 d_c(i,j) = xite*e(k)*w(j)*h(j)*(x(i) - c(i,j))*(b(j)^-2); end end w = w_1 + d_w + alfa*(w_1 - w_2);%w_1与w_2之前赋值了w,后面在没变,d_w等值在前面有e(k)与h(j)更新,用来计算权值 b = b_1 + d_b + alfa*(b_1 - b_2); c = c_1 + d_c + alfa*(c_1 - c_2); y_1 = y(k); w_2 = w_1; w_1 = w; c_2 = c_1; c_1 = c; b_2 = b_1; b_1 = b;endB = 0;for i = 1:1:400%计算误差的和, Ji(i) = abs(e(i)); B = B + 100*Ji(i);%乘100是什么意思?endBsJ = B;
其中也有一些地方,感觉写的复杂了,比如在初始化的种群中,寻找全局极值与个体极值那里,对最小适应度的寻找,以及神经网络训练函数输入参数的设置,感觉输入可以不用设置BsJ,输出可以不用设置pop()。如有遗漏,欢迎大家指出。
代码下载地址:http://download.csdn.net/download/u011067793/10150280
阅读全文
0 0
- 【MATLAB】PSO优化RBFNN程序(带注释)
- matlab练习程序(粒子群优化PSO)
- matlab练习程序(粒子群优化PSO)
- 基本粒子群优化算法(PSO)的matlab实现
- 标准粒子群算法(PSO)及其Matlab程序和常见改进算法
- PSO优化BP神经网络在Matlab中的实现
- JPEG解码程序(带中文注释)
- PsoProcess-PSO-matlab
- 粒子群算法(PSO)介绍及matlab实现
- 粒子群优化PSO
- 粒子群优化PSO
- MATLAB中注释一段程序
- 粒子群优化-Particle Swarm Optimization(PSO)
- hdoj 1109 粒子群优化算法(PSO)
- 典型粒子群优化算法(particle swarm optimization,PSO)
- PSO粒子群优化算法
- PSO粒子群优化算法
- PSO粒子群优化算法
- Java反射之查找一个类
- 大数据
- 【指针型函数】与【函数指针】的区别
- 常见笔记本接口
- 《DELPHI赋》
- 【MATLAB】PSO优化RBFNN程序(带注释)
- Codeforces-150B-Quantity of Strings(思维)
- Python运维基础(2)函数
- 设计模式的艺术之道--代理模式
- JAVA之 值传递和引用传递
- 双循环链表
- Java8Stream_API详解
- 零基础掌握百度地图兴趣点获取POI爬虫(python语言爬取)(代码篇)
- SmarNC数控仿真软件v1.0.1412 官方版下载