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.
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
- 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.
- Configuration : Lire l’entier \(H\) (dimension des histogrammes), la string \(M\) (métrique :
euclidianaoumanhattan) et l’entier impair \(k\). - 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).
- 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).
- 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|. \]
- 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.
- 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.
- Précision : Calculer la précision globale comme le rapport entre les succès et \(Q\).
- 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. |
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.
%%writefile EP07_06.py
# Code PythonOverwriting 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.