www.gusucode.com > Ant_Colony_Optimization_feature_selection > Ant_Colony_Optimization_feature_selection.m/

    % Editor:Summer
% Institution: Shenzhen University
% E-mail:1348825332@qq.com
% date:2018-12-16
% 30 runs with 12 datasets after ACOFS
% 10-fold cross-validation with k-nn classifier
% Please download the dataset within this link:https://pan.baidu.com/s/1JzBc-erjfYRcruMSUkH7rA
clc;
clear;
%% load classification datasets
switch dataset    
    case 'isolet'
 load('isolet.mat')
    dn=5:5:50;
    dnsize=10;
    dnd=5;
    case 'sonar'
 load('sonar.mat')
    dn=5:5:50;
    dnsize=10;
    dnd=5;
    case 'Hill_Valley_without_noise_Training'
 load('Hill.mat')
    dn=5:5:50;
    dnsize=10;
    dnd=5;
    case 'Epileptic Seizure Recognitio'
 load('Epileptic Seizure Recognitio.mat')
    dn=5:5:50;
    dnsize=10;
    dnd=5;
    case 'redwine'
 load('redwine.mat')
    dn=1:1:10;
    dnsize=10;
    dnd=1;
     case 'whitewine'
 load('whitewine.mat')
    dn=1:1:10;
    dnsize=10;
    dnd=1;
    case 'MF'
 load('MF.mat')
    dn=5:5:50;
    dnsize=10;
    dnd=5;
    case 'SPECTHeart'
 load('SPECTHeart.mat')
    dn=2:2:20;
    dnsize=10;
    dnd=2;
     case 'Statlog'
 load('Statlog.mat')
    dn=2:2:20;
    dnsize=10;
    dnd=2;
    case 'Madelon'
 load('Madelon.mat')
    dn=5:5:50;
    dnsize=10;
    dnd=5;
    case 'Libras Movement'
 load('Libras Movement.mat')
    dn=5:5:50;
    dnsize=10;
    dnd=5;
    case 'LSVT_voice_rehabilitation'
 load('LSVT_voice_rehabilitation.mat')
    dn=5:5:50;
    dnsize=10;
    dnd=5;
    case 'drivFaceD'
 load('drivFaceD.mat')
    dn=5:5:50;
    dnsize=10;
    dnd=5;
   case 'Urban land cover'
 load('Urban land cover.mat')
    dn=5:5:50;
    dnsize=10;
    dnd=5; 
    case 'MEU-Mobile KSD 2016'
 load('MEU-Mobile KSD 2016.mat')
    dn=5:5:50;
    dnsize=10;
    dnd=5; 
    case 'ionosphere'
 load('ionosphere.mat')
    dn=2:2:20;
    dnsize=10;
    dnd=2;
     case 'ORL'
 load('ORL.mat')
    data=[X,Y];
    dn=5:5:50;
    dnsize=10;
    dnd=5;
     case 'COIL20'
 load('COIL20.mat')
    data=[X,Y];
    dn=5:5:50;
    dnsize=10;
    dnd=5;
     case 'orlraws10P'
 load('orlraws10P.mat')
    data=[X,Y];
    dn=5:5:50;
    dnsize=10;
    dnd=5;
     case 'pixraw10P'
 load('pixraw10P.mat')
    data=[X,Y];
    dn=5:5:50;
    dnsize=10;
    dnd=5;
     case 'warpAR10P'
 load('warpAR10P.mat')
    data=[X,Y];
    dn=5:5:50;
    dnsize=10;
    dnd=5;
     case 'warpPIE10P'
 load('warpPIE10P.mat')
    data=[X,Y];
    dn=5:5:50;
    dnsize=10;
    dnd=5;
     case 'Yale'
 load('Yale.mat')
    data=[X,Y];
    dn=5:5:50;
    dnsize=10;
    dnd=5;
     case 'GLIOMA'
 load('GLIOMA.mat')
    data=[X,Y];
    dn=5:5:50;
    dnsize=10;
    dnd=5;
     case 'lung_discrete'
 load('lung_discrete.mat')
    data=[X,Y];
    dn=5:5:50;
    dnsize=10;
    dnd=5;
     case 'colon'
 load('colon.mat')
    data=[X,Y];
    dn=5:5:50;
    dnsize=10;
    dnd=5;
    case 'lung'
 load('lung.mat')
    data=[X,Y];
    dn=5:5:50;
    dnsize=10;
    dnd=5;
    case 'ForestTypes'
 load('ForestTypes.mat')
    dn=2:2:20;
    dnsize=10;
    dnd=2;
end
%% Parameters setting
e=10; % e-fold cross-validation
group=data(:,end);
class=unique(data(:,end));
for i=1:length(class)
    sa=[];
    sa=data((group==class(i)),:);
    [number_of_smile_samples,~] = size(sa); % Column-observation
    smile_subsample_segments1 = round(linspace(1,number_of_smile_samples,e+1)); % indices of subsample segmentation points    
    data_group{i}=sa;
    smile_subsample_segments{i}=smile_subsample_segments1;
end
RHO=corr(data);
R=abs(RHO);
n=size(data,2)-1;   % The number of features without class
CrossOverProb=0.9;  % The Cross Over Probability
MutationProb=0.04;  % The Mutation Probability
GenerationNo = 100; % The Number of generation
na = 50;            % The Size of popuation
cc = 1;
maxrun=30;  %run times
   Best_fit=zeros(1,dnsize);
for run=1:maxrun
   Best_fitness=zeros(1,dnsize);
for dnf=dn
    m=dnf; % The number of selected features
        for i=1:n
            trail(i) = cc;
            deltatrail(i) = 0;
        end    
maxnoiteration = 100;
k = 50;
p = 1;
rho = 0.75;
alpha=1;
beta=1;
counter=1;   % The First iteration 
%%  Initialize population
for j=1:na
     Select = randperm(n);
     s(j,1:m)= Select(1:m);
end    
popu=s;
fv=zeros(1,m);
%% Divide training set and test set and calculate fitness value with 10-fold cross-validation
for jdx=1:na
   for i=1:e   
    data_ts=[];data_tr =[];
    for j=1:length(class)
      smile_subsample_segments1=smile_subsample_segments{j};
      sa=data_group{j};
      test= sa(smile_subsample_segments1(i):smile_subsample_segments1(i+1) , :); % current_test_smiles
      data_ts=[test;data_ts] ; %training set
      train = sa;
      train(smile_subsample_segments1(i):smile_subsample_segments1(i+1),:) = [];
      data_tr =[train;data_tr];%test set
    end
    val=s(jdx,:);
    mdl = fitcknn(data_tr(:,val),data_tr(:,end),'NumNeighbors',4,'Standardize',1);%KNN-classifier
    Ac1=predict(mdl,data_ts(:,val)); 
    Fit(i)=sum(Ac1~=data_ts(:,end))/size(data_ts,1);
end
    E(1,jdx)=mean(Fit);
end
        
[MinError,MinErrorIndex]=min(E);
[SO,IX]=sort(E); %Output Individual Optimality

for j=1:k    
   for l=1:m
      for i=1:n
         deltatrail(i)=0;
         if (s(IX(j),l)==i)
            Errorg = max(SO(1:k))-E(IX(j));
            Errorhg=0;
            for h=1:k
              if ( (max(SO(1:k))-E(IX(h))) > Errorhg ) 
                Errorhg = max(SO(1:k))-E(IX(h));
                end
            end    
            if (Errorhg ~= 0)
              deltatrail(i)=Errorg/Errorhg; 
            else
              deltatrail(i)=1;
            end 
         end  
         trail(i)= rho * trail(i) + deltatrail(i);
      end 
   end 
end  
%% looping
while ( (counter < maxnoiteration) & (MinError > 0.001) )
s=popu;
counter = counter+1;
for j=1:na
    temp1(1:m)= s(IX(round(rand*(k-1))+1),1:m);
    r=randperm(m);
    for l=1:m-p
      temp2(l)=temp1(r(l));
    end        
    s(j,1:m-p)=temp2(1:m-p);
end    


for mm = m-p+1:m
  for j=1:na
   for i=1:n
     flag=0;
     for l=1:m-p
        if (s(j,l)==i)
          flag=1;
        end
     end  
     if (flag==1)
       USM(i)=0;
     else
       den=0;
       for l=1:m-p
         den=den+R(i,s(j,l));
       end  
       if (den~=0)
           LI(i)=R(i,n+1)/den;
       else
           LI(i)=R(i,n+1);
       end   
       vis(i)=LI(i)^beta;
       trail_p(i)=trail(i)^alpha;
       sigma=0;
       for ii=1:n
         flag=0;
         for l=1:m-p
           if(s(j,l)==ii)
             flag=1;
           end
         end  
         if (flag==0)
           den=0;
           for l=1:m-p
             den=den+R(ii,s(j,l));
           end  
           if (den~=0)
              LI(ii)=R(ii,n+1)/den;
           else
              LI(ii)=R(ii,n+1);
           end   
           sigma=sigma+ (trail(ii)^alpha) * (LI(ii)^beta);
         end  
       end  
       USM(i)=(vis(i)*trail_p(i))/sigma;  
       end  
   end  
   [maxf,maxfindex]=max(USM);
   s(j,mm)=maxfindex;
  end
end      


for j=1:na
    flag=0;
    for k1=1:m
        for k2=k1+1:m
            if(s(j,k1)==s(j,k2))
               flag=1;
            end
        end
    end  
    if (flag==1)
         Select=randperm(n);
         s(j,1:m)=Select(1:m);
    end  
end 
        


for i=1:na
  for j=i+1:na 
    if (s(i,1:m)==s(j,1:m))
      Select = randperm(n);
       s(j,1:m)= Select(1:m);
    end
  end
end 
    
for jdx=1:na
   for i=1:e    
    data_ts=[];data_tr =[];
    for j=1:length(class)
      smile_subsample_segments1=smile_subsample_segments{j};
      sa=data_group{j};
      test= sa(smile_subsample_segments1(i):smile_subsample_segments1(i+1) , :); % current_test_smiles
      data_ts=[test;data_ts] ; 
      train = sa;
      train(smile_subsample_segments1(i):smile_subsample_segments1(i+1),:) = [];
      data_tr =[train;data_tr];
    end
    val=s(jdx,:);
    mdl = fitcknn(data_tr(:,val),data_tr(:,end),'NumNeighbors',4,'Standardize',1);
    Ac1=predict(mdl,data_ts(:,val)); 
    Fit(i)=sum(Ac1~=data_ts(:,end))/size(data_ts,1);
   end
       fv(1,jdx)=mean(Fit);
    if fv(1,jdx)<E(1,jdx)  %Update optimal
        E(1,jdx)=fv(1,jdx);
        popu(jdx,:)=val;
    end
end
        
[MinError,MinErrorIndex]=min(E);
[SO,IX]=sort(E);

fprintf('RUN: %d \t subsetsize: %d \t Iter: %d \t Err: %.4f \t \n',run,dnf,counter,MinError)
for j=1:k
   for l=1:m
      for i=1:n
         deltatrail(i)=0;
         if (s(IX(j),l)==i)
            Errorg = max(SO(1:k))-E(IX(j));
            Errorhg=0;
            for h=1:k
              if ( (max(SO(1:k))-E(IX(h))) > Errorhg ) 
                Errorhg = max(SO(1:k))-E(IX(h));
                end
            end    
            if (Errorhg ~= 0)
              deltatrail(i)=Errorg/Errorhg; 
            else
              deltatrail(i)=1;
            end 
         end  
         trail(i)= rho * trail(i) + deltatrail(i);
      end 
   end
end 


%for j=1:na
%    temp1(1:m)= s(IX(round(rand*(k-1))+1),1:m);
%    r=randperm(m);
%    for l=1:m-p
%     temp2(l)=temp1(r(l));
%    end;        
%    s(j,1:m-p)=temp2(1:m-p);
%end;    

end    
Best_fitness(1,dnf/dnd)= MinError;
end
Best_fit(run,:)=Best_fitness;
end
%% Store the final results
    BESTFIT=(1-mean(Best_fit))*100;
    save('bsofs','Best_fit','BESTFIT')