function [aa1_train,aa2_train,aa3_train,aa4_train,aa_train,aa1_test,aa2_test,aa3_test,aa4_test,aa_test,gbest]= pso(Swarmsize,particlesize,LoopCount)
% swarmsize:种群规模 loopcount: 总迭代次数 particlsize: 粒子维数,等于要寻优的参数个数
% the parameters of PSO, you don't need to change
tic % 计时开始
c1 = 2; % 学习因子1
c2 = 2; % 学习因子2
cc=0; % Y. 这个是什么?
%% 每个参数的取值范围
Vmax=5; % 速度的最大最小值
Vmin=-5;
popmax=50; %
popmin=-50;
%% 初始化粒子的速度和位置,并计算适应度(用识别错误率表示)
for i=1:Swarmsize
pop(i,:)=rand(1,particlesize); % initialize the particles初始化(位置?)
V(i,:)=rands(1,particlesize); %initialize the speed of particles
%fitness(i)=fun(pop(i,:)); % compute the fitness function 适应度函数
[err,a1_train(i),a2_train(i),a3_train(i),a4_train(i),a_train(i),a1_test(i),...
a2_test(i),a3_test(i),a4_test(i),a_test(i)] = fit_pso_svm(pop(i,:));
fitness(i)=err; % err 为识别错误率
end
% to find the global optimization results
[bestfitness,bestindex]=min(fitness);
gbest=pop(bestindex,:); % 最好结果的粒子 % the particle which find the global best results
pbest=pop; % 每个粒子自身发现的到目前为止最好位置,因为这里刚初始化,所以等于粒子的位置
fitnesspbest=fitness; % 每个粒子的本身发现的到目前为止的最佳适应度
fitnessgbest=bestfitness; % 全局最佳的适应度
%% update the particles
for i=1:LoopCount
% 单个单个地对50个粒子处理 更新粒子的位置并计算适应度
for j=1:Swarmsize
% 更新粒子的速度和位置
% 1.记忆项↓ 2. 自身认知项↓ 3.群体认知项↓
V(j,:) = V(j,:) + c1*rand*(pbest(j,:) - pop(j,:)) + c2*rand*(gbest - pop(j,:)); ... % 第一次时的 gbest 和 pop完全一样
V(j,find(V(j,:)>Vmax))=Vmax;
V(j,find(V(j,:)<Vmin))=Vmin;
% 更新粒子的位置
pop(j,:)=pop(j,:)+V(j,:);
pop(j,find(pop(j,:)>popmax))=popmax;
pop(j,find(pop(j,:)<popmin))=popmin;
% fitness function 重新计算粒子的适应度
% fitness(i,j)=fun(pop(j,:));
[err,a1_train(j),a2_train(j),a3_train(j),a4_train(j),a_train(j),a1_test(j),...
a2_test(j),a3_test(j),a4_test(j),a_test(j)] = fit_pso_svm(pop(j,:));
% Y. 原来是fit_KH_svm(pop(j,:));但是并没有定义这个函数,改为了fit_pso_svm;
fitness(j)=err;
if fitnesspbest(j)>fitness(j) % Y. 如果粒子当前的适应度比它自身的最佳适应度高,就更新
fitnesspbest(i)=fitness(j); % Y. 每个粒子到目前为止的最优值
pbest(j,:)=pop(j,:); % Y. 粒子的局部最佳位置 % Updated local optimal
end
end
% 对50个粒子更新位置并重新计算适应度一次
% Search global optimal weight 重新寻找全局优位置和适应度
[fitness, index]=sort(fitness); % arrange in order of size from mininum to maxinum
% index 是fitness之前的位置
if fitnessgbest>fitness(1)
fitnessgbest=fitness(1); %到目前为止的全局最优适应度
gbest=pop(index(1),:); % 到目前为止的全局最佳位置
aa1_train=a1_train(:,index(1));
aa2_train=a2_train(:,index(1));
aa3_train=a3_train(:,index(1));
aa4_train=a4_train(:,index(1));
aa_train=a_train(:,index(1)); % 目前的全局最佳位置的平均训练识别率
aa1_test=a1_test(:,index(1));
aa2_test=a2_test(:,index(1));
aa3_test=a3_test(:,index(1));
aa4_test=a4_test(:,index(1));
aa_test=a_test(:,index(1)); % 目前全局最佳位置的平均测试识别率
end
% BestFitness(I)=Kgb; %每一代中适应度函数值最小的一个
save('fitnessgbest.txt','aa1_train','aa2_train','aa3_train','aa4_train',...
'aa_train','aa1_test','aa2_test','aa3_test','aa4_test','aa_test','gbest','-ascii','-double')
% 为什么要对 50 单独处理??
% % 前面已经对fitness 由小到大排序, 此时j = 50 ,如果最后1个粒子的最小错误率比全体粒子的最大错误率大??
if fitness(j) < fitnesspbest(j) % 小于 因为适应度是识别错误率
pbest(j,:) = pop(j,:); %
fitnesspbest(j) = fitness(j);
end
%
if fitness(j) < fitnessgbest
gbest = pop(j,:);
fitnessgbest = fitness(j);
end
if aa_train>=0.84
break;
end
end
yy(i)=fitnessgbest;
end
% clear fitness;
% bestyy(jj)=min(yy);
% bestyy_mean=mean(bestyy);
% if fitnessgbest>0.1
% cc=cc+1;
% end
% allxy(jj,:)=zbest;
%
% meanallxy=mean(allxy)
% t=toc;
% plot(yy)
% yy_fun1_pso=yy;
% save('yy_fun1_pso_80.txt','yy_fun1_pso','-ascii','-double')
PSO优化SVM参数
需积分: 50 146 浏览量
2018-05-11
15:57:30
上传
评论 1
收藏 44.33MB ZIP 举报
qqqqqqqqqqq1118
- 粉丝: 2
- 资源: 21
最新资源
- STM32单片机FPGA毕设电路原理论文报告位标器动平衡测试系统中相位测量的实现
- STM32单片机FPGA毕设电路原理论文报告卫星天线的单片机快速对星系统
- STM32单片机FPGA毕设电路原理论文报告微型机与单片机串行通信的实现
- 戴尔Windowshello驱动程序
- STM32单片机FPGA毕设电路原理论文报告微型机单片机两级温度控制系统
- STM32单片机FPGA毕设电路原理论文报告微型地图里程测量仪的研制
- STM32单片机FPGA毕设电路原理论文报告微弱生理信号在多通道数据采集系统中的研究与实现
- 易打标-专业版-条码标签打印软件
- STM32单片机FPGA毕设电路原理论文报告微机原理与单片机课程体系改革
- STM32单片机FPGA毕设电路原理论文报告微机控制晶闸管投切电容器无功补偿装置
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈