TP-analyse-donnees/TP4/kppv.m
2023-05-29 16:43:44 +02:00

60 lines
2 KiB
Matlab
Executable file

%--------------------------------------------------------------------------
% ENSEEIHT - 1SN - Analyse de donnees
% TP4 - Reconnaissance de chiffres manuscrits par k plus proches voisins
% fonction kppv.m
%
% Données :
% DataA : les données d'apprentissage (connues)
% LabelA : les labels des données d'apprentissage
%
% DataT : les données de test (on veut trouver leur label)
% Nt_test : nombre de données tests qu'on veut labelliser
%
% K : le K de l'algorithme des k-plus-proches-voisins
% ListeClass : les classes possibles (== les labels possibles)
%
% Résultat :
% Partition : pour les Nt_test données de test, le label calculé
%
%--------------------------------------------------------------------------
function [Partition] = kppv(DataA, labelA, DataT, Nt_test, K, ListeClass)
[Na,~] = size(DataA);
% Initialisation du vecteur d'étiquetage des images tests
Partition = zeros(Nt_test,1);
disp(['Classification des images test dans ' num2str(length(ListeClass)) ' classes'])
disp(['par la methode des ' num2str(K) ' plus proches voisins:'])
% Boucle sur les vecteurs test de l'ensemble de l'évaluation
for i = 1:Nt_test
disp(['image test n°' num2str(i)])
% Calcul des distances entre les vecteurs de test
% et les vecteurs d'apprentissage (voisins)
distance = vecnorm(DataA - DataT(i,:));
% On ne garde que les indices des K + proches voisins
[D, I] = sort(distance);
kvoisins = I(1:K);
% Comptage du nombre de voisins appartenant à chaque classe
classe = labelA(kvoisins);
% Recherche de la classe contenant le maximum de voisins
[M, F, C] = mode(classe);
% Si l'image test a le plus grand nombre de voisins dans plusieurs
% classes différentes, alors on lui assigne celle du voisin le + proche,
% sinon on lui assigne l'unique classe contenant le plus de voisins
% Assignation de l'étiquette correspondant à la classe trouvée au point
% correspondant à la i-ème image test dans le vecteur "Partition"
Partition(i) = M;
end