📄 pso.asv
字号:
% PSO for the feature eselection in KNN
function [gbest1,gbest_rmse1]=pso(x,feature,wmax,wmin,vmax,c1,c2,ps,tmax,nn)
[n2,p2]=size(feature);
% Initialize the inner parameters
pso=zeros(ps,p2);
v1=zeros(ps,p2);
pso_rmse=zeros(ps,10);%%同上,每个粒子都有以上十项指标
pbest=zeros(ps,p2);
pbest_rmse=zeros(ps,10);%%同上,每个粒子都有以上十项指标
gbest=zeros(1,p2);
gbest_rmse=zeros(1,10);%%同上,每个粒子都有以上十项指标
pso1=[];
for i=1:ps
pbest_rmse(i,1)=100;
pbest_rmse(i,10)=0;
gbest_rmse(1,1)=100;
gbest_rmse(1,10)=0;
end
for i=1:ps
pso_rmse(i,1)=100;
pso_rmse(i,2)=i;
pso_rmse(i,10)=0;
end
%for i=1:6
% pso_rmse1(i)=0;
%end
% inialize the particle
for i=1:ps
pso(i,:)=0;
w(i)=floor(round(rand*15+0.5));
for j=1:w(i)
z=floor(round(rand*15+0.5));
while(pso(i,z)~=0)
z=floor(round(rand*15+0.5));
if(pso(i,z)==0)
pso(i,z)=1;
break;
end
end
if(pso(i,z)==0)
pso(i,z)=1;
end
end
end
[n,p]=size(feature); % data set
n1=floor(n/2); % two-fold
n2=n-n1;
for i=1:ps
for l=1:p2
pso1(l)=pso(i,l);
end
%cmodel=ones(2,2);
[pso_rmse1]=checkoutnknn(feature,pso1,x,nn);% 校验数据
pso_rmse(i,1)=pso_rmse1(1);
pso_rmse(i,2)=i;%%粒子标识
pso_rmse(i,3)=pso_rmse1(3);
pso_rmse(i,4)=pso_rmse1(4);
pso_rmse(i,5)=pso_rmse1(5);
pso_rmse(i,6)=pso_rmse1(6);
pso_rmse(i,7)=pso_rmse1(7);%% 第一类分类正确率
pso_rmse(i,8)=pso_rmse1(8);%% 第二类分类正确率
pso_rmse(i,9)=pso_rmse1(9);%%分类正确率平均值
pso_rmse(i,10)=pso_rmse1(10); %%分类总正确率
%%分类总正确率
if pso_rmse(i,1)<=pbest_rmse(i,1)%%如果粒子当前结果优于自身最优位置
for h=1:10
pbest_rmse(i,h)=pso_rmse(i,h);%% 自身最优位置的指标修改为当前的指标
end
for j=1:p2
pbest(i,j)=pso(i,j);%% 自身最优位置修改为当前位置
end
end
if pso_rmse(i,1)<=gbest_rmse(1,1)%% 如果粒子当前结果优于整体最优位置
for h=1:10
gbest_rmse(1,h)=pso_rmse(i,h);%% 整体最优位置的指标修改为当前的指标
end
for j=1:p2
gbest(1,j)=pso(i,j);%%整体最优位置修改为当前位置
end
end
end
for iteration=1:tmax%%迭代50次
for i=1:ps%%下面的算法与初始值时的二折算法一样,故不作标注
for l=1:p2
pso1(l)=pso(i,l);
end
%cmodel=[];
[pso_rmse1]=checkoutnknn(feature,pso1,x,nn); %数据校验
pso_rmse(i,1)=pso_rmse1(1);
pso_rmse(i,2)=i;%%粒子标识
pso_rmse(i,3)=pso_rmse1(3);
pso_rmse(i,4)=pso_rmse1(4);
pso_rmse(i,5)=pso_rmse1(5);
pso_rmse(i,6)=pso_rmse1(6);
pso_rmse(i,7)=pso_rmse1(7);%% 第一类分类正确率
pso_rmse(i,8)=pso_rmse1(8);%% 第二类分类正确率
pso_rmse(i,9)=pso_rmse1(9);%%分类正确率平均值
pso_rmse(i,10)=pso_rmse1(10); %%分类总正确率
if pso_rmse(i,1)<=pbest_rmse(i,1)
for h=1:10
pbest_rmse(i,h)=pso_rmse(i,h);
end
for j=1:p2
pbest(i,j)=pso(i,j);
end
end
if pso_rmse(i,1)<=gbest_rmse(1,1)
for h=1:10
gbest_rmse(1,h)=pso_rmse(i,h);
end
for j=1:p2
gbest(1,j)=pso(i,j);
end
end
end
for i=1:ps%%对于每个粒子进行粒子群算法的迭代
w=wmax-(wmax-wmin)/tmax*iteration;%%懒惰因子的计算
%c1=2;%%学习因子计算
%c2=2;%%学习因子计算
for j=1:p2
v1(i,j)=v1(i,j)*w+c1*rand*(pso(i,j)-pbest(i,j))+c2*rand*(pso(i,j)-gbest(1,j));%%速度计算
if v1(i,j)>vmax
v1(i,j)=vmax-vmax/4.0;
end
if v1(i,j)<-vmax
v1(i,j)=-vmax+vmax/4.0;
end
sv=1/(1+exp(v1(i,j)));
if rand<sv
pso(i,j)=1;
else
pso(i,j)=0;
end
end
end
end
gbest_rmse1=gbest_rmse;
gbest1=gbest;
dlmwrite('pso.txt',gbest_rmse1,'-append','delimiter', ' ');
dlmwrite('pso.txt',gbest1,'-append','delimiter', ' ');
%disp('PSO运行结果为:'+gbest_rmse(1,:));
%disp(gbest(1,:));
%disp('程序结束');
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -