TNI+VO · Exercice de Programmation

EP07_06 — 🟣 Pipeline complet : Descripteurs + k-NN + Évaluation multi-classe

7.18.6 EP07_06 🟣 Pipeline complet : Descripteurs + k-NN + Évaluation multi-classe

Cet exercice intègre les trois étapes centrales du chapitre dans un pipeline unique, reproduisant en miniature le Projet pratique 2 (classification de textures synthétiques par LBP) : un ensemble d’histogrammes de descripteurs déjà extraits (comme s’il s’agissait d’histogrammes LBP) est utilisé pour entraîner un classifieur k-NN, qui est à son tour évalué sur un ensemble de test indépendant au moyen d’une matrice de confusion multi-classe.

Contrairement à l’EP07_01, ici l’espace des caractéristiques a une dimension arbitraire \(H\) (la taille de l’histogramme), il existe plus de deux classes, et la métrique de distance est un paramètre d’entrée — ce qui permet de reproduire l’expérience de comparaison de métriques discutée dans le chapitre.

7.18.6.1 📋 Directives d’implémentation

  1. Classes : Lire l’entier \(C\) (nombre de classes) suivi de \(C\) noms de classe (strings sans espace), dans l’ordre où ils doivent apparaître dans la matrice de confusion.
  2. Configuration : Lire l’entier \(H\) (dimension des histogrammes), la string \(M\) (métrique : euclidiana ou manhattan) et l’entier impair \(k\).
  3. Entraînement : Lire l’entier \(N\) puis \(N\) lignes, chacune contenant le nom de la classe suivi de \(H\) valeurs réelles (l’histogramme du descripteur).
  4. Test : Lire l’entier \(Q\) puis \(Q\) lignes, chacune contenant le nom de la classe réelle suivi de \(H\) valeurs réelles (l’histogramme du descripteur de l’échantillon de test).
  5. Distance : Pour chaque échantillon de test, calculer la distance à chaque exemple d’entraînement en utilisant la métrique \(M\) : \[ d_{\text{euclidiana}}(u,v) = \sqrt{\sum_{j=1}^{H}(u_j-v_j)^2}, \qquad d_{\text{manhattan}}(u,v) = \sum_{j=1}^{H} |u_j - v_j|. \]
  6. Classification k-NN : Sélectionner les \(k\) exemples d’entraînement les plus proches (départage des distances par l’ordre de lecture, comme dans l’EP07_01) et classer par la classe majoritaire parmi eux. En cas d’égalité de vote entre deux ou plusieurs classes, choisir celle qui apparaît en premier dans la liste des classes du point 1.
  7. Matrice de confusion : Construire une matrice \(C \times C\) où la ligne correspond à la classe réelle et la colonne à la classe prédite, en suivant l’ordre des classes du point 1.
  8. Précision : Calculer la précision globale comme le rapport entre les succès et \(Q\).
  9. Sortie : Pour chaque échantillon de test, dans l’ordre d’entrée, imprimer la classe prédite. Ensuite, imprimer la matrice de confusion (une ligne par classe réelle, valeurs séparées par des espaces, dans l’ordre des classes). Enfin, imprimer la précision arrondie à 4 décimales.

7.18.6.2 📌 Contraintes computationnelles

  • Métrique sélectionnable : implémenter les deux distances ; la métrique \(M\) définit celle utilisée pour toute l’exécution (il n’est pas possible de mélanger les métriques dans le même appel).
  • Départage de vote déterministe : le critère du point 6 (ordre de la liste des classes) doit être suivi même lorsque l’égalité implique plus de deux classes.
  • Indépendance de l’entraînement et du test : il n’est pas nécessaire de vérifier que les échantillons de test n’apparaissent pas dans l’entraînement — supposer que l’entrée est valide.

7.18.6.3 🧠 Fondement théorique

Étape de l’exercice Étape correspondante dans le chapitre
Histogrammes d’entraînement/test déjà extraits descritor_lbp appliqué aux textures synthétiques
Distance euclidienne ou Manhattan Paramètre metric du KNeighborsClassifier
Vote majoritaire avec \(k\) voisins KNeighborsClassifier.predict
Matrice de confusion \(C\times C\) confusion_matrix de scikit-learn
Précision globale accuracy_score de scikit-learn

Cet exercice met en évidence, de manière contrôlée, un résultat discuté dans le chapitre : le choix de la métrique de distance et de la valeur de \(k\) peut modifier la classe prédite pour un même échantillon, même en maintenant fixe le descripteur utilisé — renforçant que, dans la reconnaissance de formes classique, le descripteur, la métrique et le classifieur forment un système interdépendant, et non des pièces isolées.

7.18.6.4 📦 Spécification d’entrée et de sortie (VPL)

Entrée :

  • Ligne 1 : entier \(C\) suivi de \(C\) noms de classe.
  • Ligne 2 : entier \(H\), string \(M\) et entier \(k\).
  • Ligne 3 : entier \(N\).
  • Prochaines \(N\) lignes d’entraînement : nom de la classe suivi de \(H\) réels.
  • Ligne suivante : entier \(Q\).
  • Prochaines \(Q\) lignes de test : nom de la classe réelle suivi de \(H\) réels.

Sortie :

  • \(Q\) lignes avec la classe prédite de chaque échantillon de test, dans l’ordre d’entrée.
  • \(C\) lignes avec la matrice de confusion (une ligne par classe réelle).
  • Dernière ligne : Acuracia: <valeur>.

7.18.6.5 📌 Exemples

Entrée (résumée) Sortie Observation
2 granular listrada
2 euclidiana 1
4
granular 0.9 0.1
granular 0.8 0.2
listrada 0.1 0.9
listrada 0.2 0.8
2
granular 0.85 0.15
listrada 0.15 0.85
granular
listrada
1 0
0 1
Acuracia: 1.0000
Avec \(k=1\), chaque test est classé par le voisin d’entraînement le plus proche.
Note

Ce simulateur utilise un ensemble simplifié de 3 classes (granulaire, striée, tachetée) sur des points 2D fictifs, uniquement pour illustrer le pipeline de vote, de départage et de matrice de confusion du k-NN. Dans le cadre du EP07_07, vous appliquerez cette même logique à une mosaïque d’image réelle, qui introduit une quatrième classe (échiquier) et remplace les points 2D par des histogrammes LBP extraits directement des pixels de l’image.

🎮 Simulateur EP07_06 : Pipeline k-NN multi-classe 6 Entraînement · 3 Test · 3 Classes

Choisissez la métrique, la valeur de k et l'échantillon de test (★). Voyez les k plus proches voisins, le vote, le départage si nécessaire, et comment cela se propage à la matrice de confusion et à la précision de l'ensemble entier.

Métrique (M)
Voisins (k)
Échantillon de test (★)
📏 Distances jusqu'à l'échantillon de test (triées) — #i = ordre de lecture dans la liste d'entraînement (survolez)
🗳️ Vote parmi les k voisins
📋 Matrice de confusion et précision — exécution du pipeline sur les 3 échantillons de test
Figure 7.26: Simulateur EP07_06 : Pipeline k-NN Multi-Classe (vote, départage et matrice de confusion)
%%writefile EP07_06.py
# Code Python
Overwriting EP07_06.py
TestSuite("EP07_06.py").run()
✔️ EP07_06.cases existe déjà dans casos/
📋 5 cas chargé(s) depuis casos/EP07_06.cases

🔍 Test de Python : EP07_06.py
⚠️ EP07_06.py : fichier vide (moins de 3 lignes). Tests ignorés.