% Lezione di lab TTR  -11/11/2013- LDA + KNN - Marco Cristani

% Caricare il file “iris.mat”
% dataset di 150 oggetti in uno spazio 4-dimensionale
% Calcolare la matrice di trasformazione A utilizzando la Linear
% Discriminant analysis
% Ridurre la dimensionalità del dataset a due e visualizzarlo
% visualizzare le varie classi con simboli diversi


clear all
% close all
load 'irisSet.mat'

[d,N] = size(X);
K = max(l); % numero classi in gioco;

% 1. determino le classi Ck
for k = 1:K
    a = find (l == k);
    Ck{k} = X(:,a);
end
% 2. determino le medie
for k = 1:K
    mk{k} = mean(Ck{k},2);
end
% 3. determino la numerosità della classe
for k = 1:K
    [d, Nk(k)] = size(Ck{k});
end
% 4. determino le within class covariance
for k = 1:K
    S{k} = 0;
    for i = 1:Nk(k)
        S{k} = S{k} + (Ck{k}(:,i)-mk{k})*(Ck{k}(:,i)-mk{k})';
    end
    S{k} = S{k}./Nk(k);
end
Swx = 0;
for k = 1:K
    Swx = Swx + S{k};
end

% 5. determino la between class covariance
% 5.1 determino la media totale
m = mean(X,2);
Sbx = 0;
for k=1:K
    Sbx = Sbx + Nk(k)*((mk{k} - m)*(mk{k} - m)');
end
Sbx = Sbx/K;

MA = inv(Swx)*Sbx;

% eigenvalues/eigenvectors
[V,D] = eig(MA);

% 5: transform matrix
A = V(:,1:2);

% 6: transformation
Y = A'*X;

% 7: plot
figure, scatter(Y(1,:),Y(2,:),[],l)


% %% KNN 
% el = 1;
% test = Y(:,el);
% label_test = l(el);
% 
% good = setdiff([1:size(Y,2)],el);
% Ynew = Y(:,good);
% lnew = l(good);
% 
% for i=1:size(Ynew,2)
%     dista(i)=norm(test-Ynew(:,i));
% end
% [ranked,ind]= sort(dista,'ascend');
% 
% Kn = 12;
% rankedl=lnew(ind);
% for k=1:K
%     num(k)=length(find(rankedl(1:Kn)==k));
% end
% 
% [thrash,kwin] = max(num);
% 
% %% Definizione dei confini di decisione KNN
% 
% MAXI=max(Y,[],2);
% mini=min(Y,[],2);
% 
% n_samples = 100; % ~freq di campionamento
% I=[mini(1):(MAXI(1)-mini(1))/100:MAXI(1)];
% J=[mini(2):(MAXI(2)-mini(2))/100:MAXI(2)];
% figure; hold on;
% for i=1:n_samples
%     fprintf('i=%i|%i\n',i,n_samples)
%     for j=1:n_samples
%         test = [I(i),J(j)]';
%         for w=1:size(Y,2)
%             dista(w)=norm(test-Y(:,w));
%         end
%         [ranked,ind]= sort(dista,'ascend');
%         
%         Kn = 50;
%         rankedl=l(ind);
%         for k=1:K
%             num(k)=length(find(rankedl(1:Kn)==k));
%         end
%         
%         [thrash,kwin] = max(num);
%         scatter(I(i),J(j),10,kwin);
% %         drawnow; pause(0.05)
%     end
% end




