% Lezione di lab TTR  -04/04/2012- 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 = 3;
% 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);






