No BSD License  

Highlights from
Alaa Tharwat ToolBox

from Alaa Tharwat ToolBox by Alaa Tharwat
This toolBox used in the image processing(feature extraction and classification)

[Xt,Xapp,Alpha,kM,valBeta,wM]=gda(xi,yi,X,nbclass,kernel,kerneloption,ndimfin)
function [Xt,Xapp,Alpha,kM,valBeta,wM]=gda(xi,yi,X,nbclass,kernel,kerneloption,ndimfin)


%   USAGE
%     [Xt,Xapp,Alpha,kM]=gda(xi,yi,X,nbclass,kernel,kerneloption,ndimfin)
%
%  This function is a script that process the
%  Linear Discriminant Analysis .
%
%   xi,yi : learning data
%   Xt : testing data
%   nbclass : number of class
%   ndimfin (def=nbclass-1): output dimention
%
%   xp : projected learn data
%   Xtp : projected test data  
%   x1p,x2p,x3p : projected learn data by class
%
%   P : discrimant axis
%   VP : associated eigen value.

% Gaston Baudat & Fatiha Anouar / 21st October 2000 / Exton PA
% 19341 USA
% Vincent Guigue / 5th march 2003
 
if nargin<7
  ndimfin = nbclass-1;
end

% tri des points par classe -> matrice de poids !
xi_tri = [];
yi_tri = [];
ordre_mem = [];
for i=1:nbclass
  index = find(yi==i);
  xi_tri = [xi_tri; xi(index,:)];
  yi_tri = [yi_tri, i*ones(length(index),1)];
  ordre_mem = [ordre_mem; index];
end

xi = xi_tri;
yi = yi_tri;


n = nbclass; % nb of class
nbpts = size(xi,1); % nb pts
nbpts_t = size(X,1); % nb pts

for i=1:nbclass
  nbpts_i(i,1)=length(find(yi==i));
end


% kernel
kM = svmkernel(xi,kernel,kerneloption);
kMt= svmkernel(X,kernel,kerneloption,xi);
%keyboard

% Uncentred -> centred
kM = kM - (1/nbpts*(ones(nbpts)*kM)) - (1/nbpts*(kM'*ones(nbpts))) + 1/(nbpts^2)*(ones(nbpts)*kM*ones(nbpts));
%keyboard

kMt = kMt - (1/nbpts_t*(ones(nbpts_t)*kMt)) - (1/nbpts*(kMt*ones(nbpts))) + 1/(nbpts_t*nbpts)*(ones(nbpts_t)*kMt*ones(nbpts));

[veckM,valkM]=eig(kM);

% sort valkM
aux = diag(valkM);
[val,ind_sort] = sort(-aux);
valkM = diag(aux(ind_sort));
veckM = veckM(:,ind_sort);

% Rank -> new rank
minVal=max(diag(valkM))/1000; 
elimin = find(diag(valkM) < minVal);
rankkM = nbpts-length(elimin);

% modify kM
keep = setdiff([1:nbpts],elimin);
valkM=valkM(keep,keep);
veckM=veckM(:,keep);


kM=veckM*valkM*veckM';
fprintf('Estimated rank of K: %d (elimin %d var)\n',rankkM,length(xi)-rankkM);


% weights matrix
ptr=1;
for i=1:nbclass
  index = ptr:ptr+nbpts_i(i,1)-1;
  %index = find(yi==i); % les points sont tries !
  
  wM(index,index)=1/nbpts_i(i,1)*ones(nbpts_i(i,1));
  
  ptr = ptr+nbpts_i(i,1);
end

%compute alpha normalized vectors
nbAxes=min([rankkM ; nbpts-1 ; ndimfin]);
[vecBeta,valBeta]=eig(veckM'*wM*veckM); % ???

% recuperer les nbAxes + grande
% eliminer les complexes

aux = diag(valBeta);
ind_noimag = find(imag(aux)==0 & real(aux)>10e-6);
[val,ind] = sort(-aux(ind_noimag));
ind_sort = ind_noimag(ind);

valBeta = diag(aux(ind_sort));
vecBeta = vecBeta(:,ind_sort); 

tmp = veckM*inv(valkM)*vecBeta;

for i=1:nbAxes
  Alpha(:,i)=tmp(:,i)/sqrt(tmp(:,i)'*kM*tmp(:,i));
end


Xapp = kM*Alpha(:,1:nbAxes);
% remise dans l'ordre...
newordre(ordre_mem) = [1:nbpts];
Xapp = Xapp(newordre,:);
Xt = kMt*Alpha(:,1:nbAxes);

if newordre~=[1:nbpts];
  fprintf('Changement de l''ordre des points...\n');
end


Contact us at files@mathworks.com