Numérique et sciences informatiques (spécialité) · Première
Algorithme des k plus proches voisins : exercices de 1re NSI
Publié le 6 novembre 2026 · Mis à jour le 6 novembre 2026 · Signaler une erreur
L'essentiel
- L'algorithme des k plus proches voisins classe un nouvel objet d'après la classe majoritaire de ses k voisins les plus proches dans le jeu de données labellisé 23.
- Avec k = 1, l'objet reçoit la classe de son unique plus proche voisin 3.
- Pour une valeur à estimer (régression), on prend la moyenne des valeurs des k voisins 3.
- La distance courante pour des variables continues est la distance euclidienne ; la normalisation des données peut améliorer la précision 3.
- La recherche naïve des voisins parcourt les n points un par un : le temps de calcul est linéaire en n 4.
Comment utiliser ces exercices
Ces exercices te font manipuler l'algorithme des k plus proches voisins, du calcul d'une distance jusqu'à l'écriture d'un programme Python. Ils sont rangés par difficulté croissante. Cherche chaque exercice sur papier avant d'ouvrir les indices, puis compare ta démarche avec la correction : une étape de la correction correspond à une action précise, pas à un résultat tombé du ciel.
Ce chapitre vient après le parcours séquentiel d'un tableau, les tris par insertion et par sélection, la recherche dichotomique et les algorithmes gloutons. Tu auras surtout besoin du parcours d'un tableau et d'un tri, car l'algorithme consiste à parcourir toutes les données puis à garder les plus proches.
Les exercices
Exercice 1 Calculer une distance euclidienne
Dans un repère orthonormé, on place deux objets décrits par deux caractéristiques : et .
Calcule la distance euclidienne entre et .
Indice 1
Écris d'abord les écarts et .
Indice 2
Élève chaque écart au carré, additionne, puis prends la racine carrée.
Voir la correction pas à pas
On calcule l'écart des abscisses : .
On calcule l'écart des ordonnées : .
On additionne les carrés : .
On prend la racine carrée : .
La distance entre et vaut 5. La distance euclidienne est la distance usuelle pour des variables continues 3 ; c'est la brique de base de tous les exercices suivants.
Exercice 2 Classer avec k = 1
Un jeu de données contient quatre points déjà classés :
| Point | Coordonnées | Classe |
|---|---|---|
| rouge | ||
| bleu | ||
| rouge | ||
| bleu |
On veut classer le nouveau point avec .
Détermine la classe de , puis donne la distance de à son plus proche voisin (valeur décimale arrondie au dix-millième).
Indice 1
Calcule la distance de à chacun des quatre points.
Indice 2
Avec , une seule distance compte : la plus petite.
Voir la correction pas à pas
.
.
.
.
La plus petite distance est : le plus proche voisin est , de classe bleu.
est classé bleu, avec un plus proche voisin à . C'est bien la règle du cas : l'objet prend la classe de son plus proche voisin 3. Remarque que , qui a la même ordonnée que , n'est pourtant pas le plus proche au sens de la distance.
Exercice 3 Vote parmi trois voisins
On reprend l'idée du vote avec . Le jeu de données est :
| Point | Coordonnées | Classe |
|---|---|---|
| rouge | ||
| rouge | ||
| bleu | ||
| bleu | ||
| bleu | ||
| rouge |
Le nouveau point est .
- Calcule les distances de à chaque point et ordonne-les.
- Donne la classe de avec .
- Quelle est la distance de à son troisième plus proche voisin (arrondie au dix-millième) ?
Indice 1
Tu peux garder les distances sous forme de racines pour comparer sans arrondir trop tôt.
Indice 2
Les trois voisins retenus sont les trois premières lignes de ton classement.
Voir la correction pas à pas
Distances : , , , , , .
Classement croissant : , , , , , .
Les trois plus proches voisins sont (rouge), (bleu) et (rouge).
Vote : 2 rouges contre 1 bleu, donc la classe majoritaire est rouge.
Le troisième voisin est : .
est classé rouge. Le résultat est la classe majoritaire parmi les voisins 3. Observe que le jeu contient autant de points rouges que de bleus : c'est la proximité qui décide, pas l'effectif de chaque classe.
Exercice 4 Quand k change le résultat
Cinq points sont classés. Le nouveau point est l'origine .
| Point | Coordonnées | Classe |
|---|---|---|
| bleu | ||
| rouge | ||
| rouge | ||
| bleu | ||
| bleu |
- Donne la classe de pour , puis .
- Pour , combien de voisins sont bleus ?
Indice 1
Les distances à l'origine se lisent directement sur les coordonnées.
Indice 2
Pour chaque valeur de , ne garde que les premiers points du classement.
Voir la correction pas à pas
Les distances à l'origine sont , , , , pour , , , , : le classement suit l'ordre des numéros.
Pour : seul compte, donc la classe est bleu.
Pour : (bleu), (rouge), (rouge) ; 2 rouges contre 1 bleu, donc rouge.
Pour : les cinq points sont retenus ; 3 bleus (, , ) contre 2 rouges, donc bleu.
Pour , il y a 3 voisins bleus.
La classe passe de bleu à rouge puis à bleu quand passe de 1 à 3 puis à 5 : le choix de influence le résultat. L'algorithme demande de connaître le nombre de voisins à considérer 3, et est généralement un petit entier positif 3. Un plus grand lisse l'effet d'un voisin isolé, mais élargit aussi le voisinage à des points moins pertinents.
Exercice 5 Estimer une valeur par régression
Une agence connaît le prix de cinq appartements d'après leur surface :
| Surface (m²) | 40 | 50 | 55 | 70 | 90 |
|---|---|---|---|---|---|
| Prix (k€) | 120 | 150 | 160 | 215 | 260 |
On veut estimer le prix d'un appartement de 58 m² en utilisant la méthode des plus proches voisins, la distance étant l'écart entre les surfaces.
Quel prix estimes-tu, en k€ ?
Indice 1
Ici, la « distance » entre deux appartements est simplement la valeur absolue de la différence des surfaces.
Indice 2
En régression, on ne vote pas : on calcule une moyenne.
Voir la correction pas à pas
Écarts de surface avec 58 m² : (40), (50), (55), (70), (90).
Les trois plus petits écarts sont , et : les appartements de 55, 50 et 70 m².
Leurs prix sont 160, 150 et 215 k€.
On fait la moyenne : .
Exercice 6 Normaliser avant de comparer
Une personne a 30 ans et gagne 2 000 € par mois. On la compare à deux personnes déjà classées :
| Personne | Âge (ans) | Salaire (€/mois) |
|---|---|---|
| 31 | 2 600 | |
| 50 | 2 050 |
- Calcule la distance euclidienne de à et à avec les valeurs brutes. Quel est le plus proche voisin ?
- On normalise chaque caractéristique en retranchant son minimum puis en divisant par son étendue : l'âge varie de 20 à 60 ans, le salaire de 1 000 à 4 000 €. Recalcule les deux distances. Que constates-tu ?
- Donne la distance normalisée entre et (arrondie au dix-millième).
Indice 1
Compare l'ordre de grandeur des écarts d'âge (quelques unités) et des écarts de salaire (centaines).
Indice 2
Après normalisation, chaque caractéristique est ramenée à une valeur entre 0 et 1.
Voir la correction pas à pas
Valeurs brutes : et . Le plus proche est , alors qu'il a 20 ans de plus que .
Normalisation de l'âge : . On obtient , , .
Normalisation du salaire : . On obtient , , .
Distances normalisées : et .
Le plus proche voisin devient . La distance normalisée vaut environ .
Sans normalisation, le salaire écrase l'âge dans le calcul : le voisin « le plus proche » change selon l'échelle choisie. Comme l'algorithme repose sur la distance, la normalisation peut améliorer sa précision 3. Avant de lancer l'algorithme sur des caractéristiques d'unités différentes, ramène-les à une échelle comparable.
Exercice 7 Compter le travail de la recherche naïve
Un jeu de données contient 5 000 points labellisés. Un programme classe chacun de 200 nouveaux points avec la recherche naïve des plus proches voisins, en calculant à chaque fois la distance du nouveau point à tous les points du jeu.
- Combien de distances le programme calcule-t-il au total ?
- Que devient ce nombre si le jeu de données double de taille ?
- Faut-il une phase d'entraînement avant de classer le premier point ?
Indice 1
Pour un seul nouveau point, combien de points du jeu sont examinés ?
Indice 2
Le nombre de calculs est-il proportionnel à la taille du jeu ?
Voir la correction pas à pas
Pour un nouveau point, la recherche naïve passe sur l'ensemble des points : 5 000 distances 4.
Pour 200 nouveaux points : distances.
Si le jeu double (), le total double aussi : distances. Le temps de calcul est linéaire en 4.
Aucune phase d'entraînement n'est nécessaire : il suffit de stocker le jeu de données 2. Le travail se fait entièrement au moment de classer.
Le programme calcule 1 000 000 de distances. Le coût d'une recherche croît proportionnellement à la taille du jeu, ce qui prépare la notion de coût d'un algorithme vue ensuite. Le coût est donc reporté sur la phase de classement plutôt que sur un entraînement préalable 2.
Exercice 8 Programmer l'algorithme en Python
Les points sont représentés par un tableau de couples ((x, y), classe). Voici un jeu de données :
donnees = [((1, 1), "rouge"), ((2, 2), "rouge"), ((3, 0), "bleu"),
((6, 5), "bleu"), ((7, 7), "bleu"), ((1, 5), "rouge")]
Écris trois fonctions :
distance(p, q)qui renvoie la distance euclidienne entre deux points du plan donnés par leurs coordonnées(x, y);k_plus_proches(donnees, x, k)qui renvoie la liste des couples(distance, classe)les plus proches du pointx;classe_majoritaire(voisins)qui renvoie la classe la plus fréquente dans cette liste.
Vérifie que classe_majoritaire(k_plus_proches(donnees, (3, 2), 3)) renvoie "rouge".
Indice 1
Construis une liste de couples (distance, classe) pour toutes les données, puis trie-la : un tri de liste de couples compare d'abord la distance.
Indice 2
Pour compter les classes, un dictionnaire dont les clés sont les classes convient.
Voir la correction pas à pas
distance: on importesqrtdepuis le modulemath, puis on renvoiesqrt((p[0]-q[0])**2 + (p[1]-q[1])**2).k_plus_proches: on parcourt toutes les données (parcours séquentiel), on construit une listelistede couples(distance(point, x), classe), on la trie avecliste.sort()et on renvoieliste[:k].classe_majoritaire: on parcourt les voisins en comptant les classes dans un dictionnaireeffectifs, puis on parcourt les clés pour garder celle dont l'effectif est le plus grand.Test : avec
x = (3, 2)etk = 3, les voisins sont ceux de l'exercice du vote (rouge, bleu, rouge), donc le programme renvoie"rouge".Code complet :
from math import sqrt def distance(p, q): return sqrt((p[0] - q[0]) ** 2 + (p[1] - q[1]) ** 2) def k_plus_proches(donnees, x, k): liste = [] for point, classe in donnees: liste.append((distance(point, x), classe)) liste.sort() return liste[:k] def classe_majoritaire(voisins): effectifs = {} for d, classe in voisins: effectifs[classe] = effectifs.get(classe, 0) + 1 meilleure = None for classe in effectifs: if meilleure is None or effectifs[classe] > effectifs[meilleure]: meilleure = classe return meilleure
Ce programme suit le principe général : calculer les distances à toutes les données, garder les plus proches, puis conclure par un vote 23. La version naïve parcourt les points, ce qui donne un temps linéaire en 4. Attention : en cas d'égalité entre deux classes, ce code garde la première rencontrée ; penser à ce cas fait partie du travail.
Exercice 9 Choisir k avec des données de test
Pour choisir , on garde de côté 8 points dont la classe est connue et on regarde combien l'algorithme en classe correctement. Les résultats sont :
| Valeur de | Points bien classés sur 8 |
|---|---|
| 1 | 5 |
| 3 | 7 |
| 5 | 6 |
- Quelle valeur de retiens-tu ?
- Quel est le taux de réussite correspondant, en pourcentage ?
- Pourquoi ne faut-il pas évaluer l'algorithme sur les points du jeu de données lui-même avec ?
Indice 1
Le taux de réussite est le nombre de points bien classés divisé par le nombre de points testés.
Indice 2
Que vaut le plus proche voisin d'un point qui appartient déjà au jeu ?
Voir la correction pas à pas
Le meilleur résultat est 7 points bien classés sur 8, obtenu pour .
Taux de réussite : .
Si l'on teste un point du jeu avec , son plus proche voisin est lui-même, à la distance 0, donc il reçoit toujours sa propre classe : le taux serait de 100 % sans rien prouver.
D'où l'intérêt de points de test mis de côté, absents du jeu de données utilisé pour chercher les voisins.
On retient , avec un taux de réussite de 87,5 %. Cette valeur est un petit entier, comme il est courant pour 3. Sur 8 points seulement, ce résultat reste fragile : un jeu de test plus grand donnerait un choix plus fiable.
Les questions qu'on se pose
Pourquoi dit-on que l'algorithme n'a pas de phase d'apprentissage ?
Quelle distance utiliser ?
Pour des variables continues, la distance usuelle est la distance euclidienne, celle des exercices de cette page 3. Pour des variables discrètes, comme du texte, une autre distance peut être employée, par exemple la distance de Hamming 3. Dans tous les cas, l'algorithme repose sur la distance, donc des caractéristiques à des échelles très différentes se normalisent d'abord 3.
Que faire en cas d'égalité lors du vote ?
Une égalité apparaît par exemple avec et deux classes à 2 voisins chacune. Le programme doit alors appliquer une règle fixée à l'avance, par exemple garder la classe du voisin le plus proche. Pour deux classes, choisir impair évite ce cas, puisque le total des voix ne peut pas être partagé également. Dans l'exercice de programmation, la version proposée garde la première classe rencontrée : à toi de décider si cette règle te convient.
Sources
Programme visé : Programme de numérique et sciences informatiques de première générale — Algorithmique · Ministère de l'Éducation nationale
- Programme de numérique et sciences informatiques de première générale — Algorithmique, Ministère de l'Éducation nationale. Consulté le 6 novembre 2026.
- Algorithme des k plus proches voisins — Ressource Éduscol, Éduscol. Consulté le 6 novembre 2026.
- Méthode des k plus proches voisins, Wikipédia. Consulté le 6 novembre 2026.
- Recherche des plus proches voisins, Wikipédia. Consulté le 6 novembre 2026.
Les numéros dans le texte renvoient à ces sources. Une source qui ne dit pas ce qu'on lui fait dire ? Signale-le.