%% Datovy soubor a jeho vizualizace

% Datovy soubor:
X1=[[2,4,3]',[12,10,8]'] % matice pacientu
X2=[[5,3,4]',[7,9,5]'] % matice kontrolnich subjektu
x0=[3.5,9] % novy subjekt, ktery chceme klasifikovat

% Vizualizace datoveho souboru:
figure
plot(X1(:,1),X1(:,2),'r.','MarkerSize',20) % vykresleni pacientu
axis([1,6,4,13]) % nastaveni os
hold on
plot(X2(:,1),X2(:,2),'k.','MarkerSize',20) % vykresleni kontrol
plot(x0(1),x0(2),'b.','MarkerSize',20) % vykresleni noveho subjektu



%% 1. Euklidovska metrika:

% 1.1 Metoda nejblizsiho souseda:

% vypocet Euklidovske vzdalenosti testovaciho subjektu x0 s ostatnimi subjekty
n=size(X1,1)+size(X2,1) % 6 subjektu
eucl_dist = zeros(1,n); % nastaveni vektoru s Eucl. vzdalenosti testovaciho subjektu od ostatnich subjektu
for i=1:size(X1,1)
   eucl_dist(i) = sqrt(sum((X1(i,:) - x0).^2)); % vypocet vzdalenosti testovaciho subjektu s jednotlivymi pacienty
end
for i=1:size(X2,1) 
   eucl_dist(i+size(X1,1)) = sqrt(sum((X2(i,:) - x0).^2)); % vypocet vzdalenosti testovaciho subjektu s jednotlivymi kontrolami
end
eucl_dist
[eucl_min,inx]=min(eucl_dist) % nejblizsi soused noveho subjektu je 5. subjekt, coz je kontrola, proto subjekt bude zarazen do kontrol

% ilustrace (je potreba funkce circle.m):
circle(x0(1),x0(2),min(eucl_dist),'b') % subjekt bude zarazen do tridy kontrol (protoze nejblizsi soused je kontrolni subjekt)
axis equal % nastaveni ekvidistantnich os (aby pak kruh byl kruhem)

% 1.2 Metoda k nejblizsich sousedu:
k=3 % ukazeme si situaci pro k=3
[eucl_sort,inx] = sort(eucl_dist) % serazeni vektoru s Euklidovskymi vzdalenostmi
circle(x0(1),x0(2),min(eucl_dist),'w') % smazani puvodniho kruhu
circle(x0(1),x0(2),eucl_sort(k),'b') % vykresleni vzdalenosti pro k=3 sousedy -> subjekt bude zarazen do tridy pacientu (mezi 3 nejbl. sousedy prevazuji pacienti)
circle(x0(1),x0(2),eucl_sort(k),'w') % smazani noveho kruhu

% 1.3 Metoda prumerne vazby
mean(eucl_dist(1:3))
mean(eucl_dist(4:6))
% subjekt bude zarazen do tridy pacientu, protoze prumerna vzdalenost od 
% teto tridy je mensi

% 1.4 Centroidova metoda
x1_mean=mean(X1,1) % centroid pacientu
x2_mean=mean(X2,1) % centroid kontrol
hold on
plot(x1_mean(1),x1_mean(2),'r*','MarkerSize',10) % vykresleni centroidu pacientu
plot(x2_mean(1),x2_mean(2),'k*','MarkerSize',10) % vykresleni centroidu kontrol
plot([x0(1),x1_mean(1)],[x0(2),x1_mean(2)],'b') % vizualizace vzdalenosti noveho subjektu od centroidu pacientu
plot([x0(1),x2_mean(1)],[x0(2),x2_mean(2)],'b') % vizualizace vzdalenosti noveho subjektu od centroidu kontrol
sqrt(sum((x1_mean - x0).^2)) %vypocet vzdalenosti od centroidu pacientu
sqrt(sum((x2_mean - x0).^2)) %vypocet vzdalenosti od centroidu kontrol
% subjekt bude zarazen do tridy pacientu, protoze jeho vzdalenost od
% centroidu pacientu je mensi nez od centroidu kontrol


%% 2. Hammingova (Manhattanska) metrika:

% 2.1 Metoda nejblizsiho souseda:
% vypocet vzdalenosti testovaciho subjektu x0 s ostatnimi subjekty pomoci Hammingovy (manhattanske) metriky
n=size(X1,1)+size(X2,1) % 6 subjektu
hm_dist = zeros(1,n); % nastaveni vektoru s Ham. (manhattan.) vzdalenosti testovaciho subjektu od ostatnich subjektu
for i=1:size(X1,1)
   hm_dist(i) = sum(abs(X1(i,:)-x0)); % vypocet vzdalenosti testovaciho subjektu s jednotlivymi pacienty
end
for i=1:size(X2,1) 
   hm_dist(i+size(X1,1)) = sum(abs(X2(i,:)-x0)); % vypocet vzdalenosti testovaciho subjektu s jednotlivymi kontrolami
end
hm_dist
[hm_min,inx]=min(hm_dist) % nejblizsi soused noveho subjektu je 5. subjekt, coz je kontrola, proto subjekt bude zarazen do kontrol

% 2.2 Metoda k nejblizsich sousedu:
k=5 % ukazeme si situaci pro k=5
[hm_sort,inx] = sort(hm_dist) % serazeni vektoru s Hammingovymi (manhattanskymi) vzdalenostmi
plot([x0(1)-hm_sort(k),x0(1)],[x0(2),x0(2)-hm_sort(k)], 'k')
plot([x0(1)-hm_sort(k),x0(1)],[x0(2),x0(2)+hm_sort(k)], 'k')
plot([x0(1),x0(1)+hm_sort(k)],[x0(2)-hm_sort(k),x0(2)], 'k')
plot([x0(1),x0(1)+hm_sort(k)],[x0(2)+hm_sort(k),x0(2)], 'k')
circle(x0(1),x0(2),eucl_sort(k),'b') % prikresleni Euklidovske vzdalenosti - protina se to proto, ze ten 5. bod neni presne na diagonale od bodu x0

% 2.3 Metoda prumerne vazby
mean(hm_dist(1:3))
mean(hm_dist(4:6))
% subjekt bude zarazen do tridy pacientu, protoze prumerna vzdalenost od 
% teto tridy je mensi

% 2.4 Centroidova metoda
x1_mean=mean(X1,1) % centroid pacientu
x2_mean=mean(X2,1) % centroid kontrol
hold on
plot(x1_mean(1),x1_mean(2),'r*','MarkerSize',10) % vykresleni centroidu pacientu
plot(x2_mean(1),x2_mean(2),'k*','MarkerSize',10) % vykresleni centroidu kontrol
plot([x0(1),x1_mean(1)],[x0(2),x0(2)], 'k') % vizualizace vzdalenosti noveho subjektu od centroidu pacientu
plot([x1_mean(1),x1_mean(1)],[x0(2),x1_mean(2)], 'k')
plot([x0(1),x2_mean(1)],[x0(2),x0(2)], 'k') % vizualizace vzdalenosti noveho subjektu od centroidu kontrol
plot([x2_mean(1),x2_mean(1)],[x0(2),x2_mean(2)], 'k')
sum(abs(x1_mean - x0)) %vzdalenost od centroidu pacientu
sum(abs(x2_mean - x0)) %vzdalenost od centroidu kontrol
% subjekt bude zarazen do tridy pacientu, protoze jeho vzdalenost od
% centroidu pacientu je mensi nez od centroidu kontrol



%% 3. Cebysevova metrika:

% 3.1 Metoda nejblizsiho souseda:
% vypocet vzdalenosti testovaciho subjektu x0 s ostatnimi subjekty pomoci Cebysevovy metriky:
n=size(X1,1)+size(X2,1) % 6 subjektu
ceb_dist = zeros(1,n); % nastaveni vektoru s Ceb. vzdalenosti testovaciho subjektu od ostatnich subjektu
for i=1:size(X1,1)
   ceb_dist(i) = max(abs(X1(i,1)-x0(1)),abs(X1(i,2)-x0(2))); % vypocet vzdalenosti testovaciho subjektu s jednotlivymi pacienty
end
for i=1:size(X2,1) 
   ceb_dist(i+size(X1,1)) = max(abs(X2(i,1)-x0(1)),abs(X2(i,2)-x0(2))); % vypocet vzdalenosti testovaciho subjektu s jednotlivymi kontrolami
end
ceb_dist
[ceb_min,inx]=min(ceb_dist) % nejblizsi soused noveho subjektu je 5. subjekt, coz je kontrola, proto subjekt bude zarazen do kontrol
[ceb_sort,inx] = sort(ceb_dist) % serazeni vektoru s Cebysevovymi vzdalenostmi
k=1
hold off
plot(X1(:,1),X1(:,2),'r.','MarkerSize',20) % vykresleni pacientu
hold on
axis([1,6,4,13])  % nastaveni os
axis equal % nastaveni ekvidistantnich os (aby pak kruh byl kruhem)
hold on
plot(X2(:,1),X2(:,2),'k.','MarkerSize',20) % vykresleni kontrol
plot(x0(1),x0(2),'b.','MarkerSize',20) % vykresleni noveho subjektu
plot(x1_mean(1),x1_mean(2),'r*','MarkerSize',10) % vykresleni centroidu pacientu
plot(x2_mean(1),x2_mean(2),'k*','MarkerSize',10)
rectangle('Position',[x0(1)-ceb_sort(k),x0(2)-ceb_sort(k),ceb_sort(k)*2,ceb_sort(k)*2], 'EdgeColor', 'r')
circle(x0(1),x0(2),eucl_sort(k),'b') % prikresleni Euklidovske vzdalenosti 
hold on
plot([x0(1)-hm_sort(k),x0(1)],[x0(2),x0(2)-hm_sort(k)], 'k') % prikresleni Hammingovy (manhattanske vzdalenosti)
plot([x0(1)-hm_sort(k),x0(1)],[x0(2),x0(2)+hm_sort(k)], 'k')
plot([x0(1),x0(1)+hm_sort(k)],[x0(2)-hm_sort(k),x0(2)], 'k')
plot([x0(1),x0(1)+hm_sort(k)],[x0(2)+hm_sort(k),x0(2)], 'k')
% vzdalenost testovaciho subjektu od nejblizsiho souseda je v tomto pripade 
% 0.5, i kdyz je pocitana kteroukoliv z techto 3 metrik (Euklidovy, 
% Hammingovy ci Cebysevovy)

% 3.2 Metoda k nejblizsich sousedu:
k=3 % ukazeme si situaci pro k=3
[ceb_sort,inx] = sort(ceb_dist) % serazeni vektoru s Cebysevovymi vzdalenostmi
hold off
plot(X1(:,1),X1(:,2),'r.','MarkerSize',20) % vykresleni pacientu
hold on
axis([1,6,4,13])  % nastaveni os
axis equal % nastaveni ekvidistantnich os (aby pak kruh byl kruhem)
hold on
plot(X2(:,1),X2(:,2),'k.','MarkerSize',20) % vykresleni kontrol
plot(x0(1),x0(2),'b.','MarkerSize',20) % vykresleni noveho subjektu
plot(x1_mean(1),x1_mean(2),'r*','MarkerSize',10) % vykresleni centroidu pacientu
plot(x2_mean(1),x2_mean(2),'k*','MarkerSize',10)
rectangle('Position',[x0(1)-ceb_sort(k),x0(2)-ceb_sort(k),ceb_sort(k)*2,ceb_sort(k)*2], 'EdgeColor', 'r')
circle(x0(1),x0(2),eucl_sort(k),'b') % prikresleni Euklidovske vzdalenosti 
hold on
plot([x0(1)-hm_sort(k),x0(1)],[x0(2),x0(2)-hm_sort(k)], 'k') % prikresleni Hammingovy (manhattanske vzdalenosti)
plot([x0(1)-hm_sort(k),x0(1)],[x0(2),x0(2)+hm_sort(k)], 'k')
plot([x0(1),x0(1)+hm_sort(k)],[x0(2)-hm_sort(k),x0(2)], 'k')
plot([x0(1),x0(1)+hm_sort(k)],[x0(2)+hm_sort(k),x0(2)], 'k')
% obrazce se protinaji, protoze vzdalenost testovaciho subjektu od tretiho
% nejblizsiho souseda (pacient c. 3) je jina, kdyz se spocita ruznymi
% metrikami (Euklidova: 1.12; Hammingova: 1.5; Cebysevova: 1)

% 3.3 Metoda prumerne vazby:
mean(ceb_dist(1:3))
mean(ceb_dist(4:6))
% subjekt bude zarazen do tridy pacientu, protoze prumerna vzdalenost od 
% teto tridy je mensi

% 3.4 Centroidova metoda
x1_mean=mean(X1,1) % centroid pacientu
x2_mean=mean(X2,1) % centroid kontrol
max(abs(x1_mean - x0)) %vzdalenost od centroidu pacientu
max(abs(x2_mean - x0)) %vzdalenost od centroidu kontrol
% subjekt bude zarazen do tridy pacientu, protoze jeho vzdalenost od
% centroidu pacientu je mensi nez od centroidu kontrol


%% 4. Canberrska metrika:

% 4.1 Metoda nejblizsiho souseda:
% vypocet vzdalenosti testovaciho subjektu x0 s ostatnimi subjekty pomoci Canberrske metriky:
n=size(X1,1)+size(X2,1) % 6 subjektu
can_dist = zeros(1,n); % nastaveni vektoru s Canb. vzdalenosti testovaciho subjektu od ostatnich subjektu
for i=1:size(X1,1)
   can_dist(i) = abs(X1(i,1)-x0(1))/(abs(X1(i,1))+abs(x0(1))) + abs(X1(i,2)-x0(2))/(abs(X1(i,2))+abs(x0(2))); % vypocet vzdalenosti testovaciho subjektu s jednotlivymi pacienty
end
for i=1:size(X2,1) 
   can_dist(i+size(X1,1)) = abs(X2(i,1)-x0(1))/(abs(X2(i,1))+abs(x0(1))) + abs(X2(i,2)-x0(2))/(abs(X2(i,2))+abs(x0(2))); % vypocet vzdalenosti testovaciho subjektu s jednotlivymi kontrolami
end
can_dist
[can_min,inx]=min(can_dist) % nejblizsi soused noveho subjektu je 5. subjekt, coz je kontrola, proto subjekt bude zarazen do kontrol

% 4.3 Metoda prumerne vazby:
mean(can_dist(1:3))
mean(can_dist(4:6))
% subjekt bude zarazen do tridy pacientu, protoze prumerna vzdalenost od 
% teto tridy je mensi

% 4.4 Centroidova metoda
x1_mean=mean(X1,1) % centroid pacientu
x2_mean=mean(X2,1) % centroid kontrol
sum(abs(x1_mean - x0)./(abs(x1_mean)+abs(x0)))  %vzdalenost od centroidu pacientu
sum(abs(x2_mean - x0)./(abs(x2_mean)+abs(x0))) %vzdalenost od centroidu kontrol
% subjekt bude zarazen do tridy pacientu, protoze jeho vzdalenost od
% centroidu pacientu je mensi nez od centroidu kontrol


%% 5. Mahalanobisova metrika:

% Vypocet kovariancnich matic:
S1=cov(X1) % kovariancni matice pacientu
S2=cov(X2) % kovariancni matice kontrol

% 5.1 Metoda nejblizsiho souseda:
% vypocet vzdalenosti testovaciho subjektu x0 s ostatnimi subjekty pomoci Mahalanobisovy metriky:
n=size(X1,1)+size(X2,1) % 6 subjektu
mah_dist = zeros(1,n); % nastaveni vektoru s Mah. vzdalenosti testovaciho subjektu od ostatnich subjektu
for i=1:size(X1,1)
   mah_dist(i) = sqrt((X1(i,:)-x0) * inv(S1) * (X1(i,:)-x0)'); % vypocet vzdalenosti testovaciho subjektu s jednotlivymi pacienty
   %mah_dist(i) = sqrt((X1(i,:)-x0) * (S1\(X1(i,:)-x0)')); % rychlejsi vypocet
end
for i=1:size(X2,1) 
   mah_dist(i+size(X1,1)) = sqrt((X2(i,:)-x0) * inv(S2) * (X2(i,:)-x0)'); % vypocet vzdalenosti testovaciho subjektu s jednotlivymi kontrolami
   %mah_dist(isize(X1,1)) = sqrt((X2(i,:)-x0) * (S2\(X2(i,:)-x0)')); % rychlejsi vypocet
end
mah_dist
[mah_min,inx]=min(mah_dist) % nejblizsi soused noveho subjektu je 5. subjekt, coz je kontrola, proto subjekt bude zarazen do kontrol

% 5.3 Metoda prumerne vazby:
mean(mah_dist(1:3))
mean(mah_dist(4:6))
% subjekt bude zarazen do tridy pacientu, protoze prumerna vzdalenost od 
% teto tridy je mensi

% 5.4 centroidova metoda:
x1_mean=mean(X1,1) % centroid pacientu
x2_mean=mean(X2,1) % centroid kontrol
sqrt((x1_mean-x0) * inv(S1) * (x1_mean-x0)') % vzd. od centroidu pacientu
sqrt((x2_mean-x0) * inv(S2) * (x2_mean-x0)') % vzd. od centroidu kontrol
% subjekt bude zarazen do tridy pacientu, protoze jeho vzdalenost od
% centroidu pacientu je mensi nez od centroidu kontrol
