60 lines
2 KiB
Mathematica
60 lines
2 KiB
Mathematica
|
%--------------------------------------------------------------------------
|
||
|
% 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
|
||
|
|