Aller au contenu

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

★☆☆Environ 5 min

Dans un repère orthonormé, on place deux objets décrits par deux caractéristiques : A(1 ; 2)A(1\,;\,2) et B(4 ; 6)B(4\,;\,6).

Calcule la distance euclidienne entre AA et BB.

Indice 1

Écris d'abord les écarts xB−xAx_B-x_A et yB−yAy_B-y_A.

Indice 2

Élève chaque écart au carré, additionne, puis prends la racine carrée.

Voir la correction pas à pas
  1. On calcule l'écart des abscisses : 4−1=34-1=3.

  2. On calcule l'écart des ordonnées : 6−2=46-2=4.

  3. On additionne les carrés : 32+42=9+16=253^2+4^2=9+16=25.

  4. On prend la racine carrée : d(A,B)=25=5d(A,B)=\sqrt{25}=5.

La distance entre AA et BB 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

★☆☆Environ 8 min

Un jeu de données contient quatre points déjà classés :

Point Coordonnées Classe
P1P_1 (1 ; 1)(1\,;\,1) rouge
P2P_2 (2 ; 5)(2\,;\,5) bleu
P3P_3 (6 ; 2)(6\,;\,2) rouge
P4P_4 (5 ; 6)(5\,;\,6) bleu

On veut classer le nouveau point X(4 ; 5)X(4\,;\,5) avec k=1k=1.

Détermine la classe de XX, puis donne la distance de XX à son plus proche voisin (valeur décimale arrondie au dix-millième).

Indice 1

Calcule la distance de XX à chacun des quatre points.

Indice 2

Avec k=1k=1, une seule distance compte : la plus petite.

Voir la correction pas à pas
  1. XP1=(1−4)2+(1−5)2=9+16=5XP_1=\sqrt{(1-4)^2+(1-5)^2}=\sqrt{9+16}=5.

  2. XP2=(2−4)2+(5−5)2=4=2XP_2=\sqrt{(2-4)^2+(5-5)^2}=\sqrt{4}=2.

  3. XP3=(6−4)2+(2−5)2=4+9=13≈3,61XP_3=\sqrt{(6-4)^2+(2-5)^2}=\sqrt{4+9}=\sqrt{13}\approx 3{,}61.

  4. XP4=(5−4)2+(6−5)2=2≈1,4142XP_4=\sqrt{(5-4)^2+(6-5)^2}=\sqrt{2}\approx 1{,}4142.

  5. La plus petite distance est XP4XP_4 : le plus proche voisin est P4P_4, de classe bleu.

XX est classé bleu, avec un plus proche voisin à 2≈1,4142\sqrt{2}\approx 1{,}4142. C'est bien la règle du cas k=1k=1 : l'objet prend la classe de son plus proche voisin 3. Remarque que P2P_2, qui a la même ordonnée que XX, n'est pourtant pas le plus proche au sens de la distance.

Exercice 3 Vote parmi trois voisins

★★☆Environ 12 min

On reprend l'idée du vote avec k=3k=3. Le jeu de données est :

Point Coordonnées Classe
AA (1 ; 1)(1\,;\,1) rouge
BB (2 ; 2)(2\,;\,2) rouge
CC (3 ; 0)(3\,;\,0) bleu
DD (6 ; 5)(6\,;\,5) bleu
EE (7 ; 7)(7\,;\,7) bleu
FF (1 ; 5)(1\,;\,5) rouge

Le nouveau point est X(3 ; 2)X(3\,;\,2).

  1. Calcule les distances de XX à chaque point et ordonne-les.
  2. Donne la classe de XX avec k=3k=3.
  3. Quelle est la distance de XX à 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
  1. Distances : XA=4+1=5XA=\sqrt{4+1}=\sqrt5, XB=1+0=1XB=\sqrt{1+0}=1, XC=0+4=2XC=\sqrt{0+4}=2, XD=9+9=18XD=\sqrt{9+9}=\sqrt{18}, XE=16+25=41XE=\sqrt{16+25}=\sqrt{41}, XF=4+9=13XF=\sqrt{4+9}=\sqrt{13}.

  2. Classement croissant : B (1)B\,(1), C (2)C\,(2), A (5≈2,24)A\,(\sqrt5\approx 2{,}24), F (13≈3,61)F\,(\sqrt{13}\approx 3{,}61), D (18≈4,24)D\,(\sqrt{18}\approx 4{,}24), E (41≈6,40)E\,(\sqrt{41}\approx 6{,}40).

  3. Les trois plus proches voisins sont BB (rouge), CC (bleu) et AA (rouge).

  4. Vote : 2 rouges contre 1 bleu, donc la classe majoritaire est rouge.

  5. Le troisième voisin est AA : d=5≈2,2361d=\sqrt5\approx 2{,}2361.

XX est classé rouge. Le résultat est la classe majoritaire parmi les kk 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

★★☆Environ 12 min

Cinq points sont classés. Le nouveau point est l'origine X(0 ; 0)X(0\,;\,0).

Point Coordonnées Classe
P1P_1 (1 ; 0)(1\,;\,0) bleu
P2P_2 (0 ; 2)(0\,;\,2) rouge
P3P_3 (3 ; 0)(3\,;\,0) rouge
P4P_4 (0 ; −4)(0\,;\,-4) bleu
P5P_5 (5 ; 0)(5\,;\,0) bleu
  1. Donne la classe de XX pour k=1k=1, k=3k=3 puis k=5k=5.
  2. Pour k=5k=5, combien de voisins sont bleus ?
Indice 1

Les distances à l'origine se lisent directement sur les coordonnées.

Indice 2

Pour chaque valeur de kk, ne garde que les kk premiers points du classement.

Voir la correction pas à pas
  1. Les distances à l'origine sont 11, 22, 33, 44, 55 pour P1P_1, P2P_2, P3P_3, P4P_4, P5P_5 : le classement suit l'ordre des numéros.

  2. Pour k=1k=1 : seul P1P_1 compte, donc la classe est bleu.

  3. Pour k=3k=3 : P1P_1 (bleu), P2P_2 (rouge), P3P_3 (rouge) ; 2 rouges contre 1 bleu, donc rouge.

  4. Pour k=5k=5 : les cinq points sont retenus ; 3 bleus (P1P_1, P4P_4, P5P_5) contre 2 rouges, donc bleu.

  5. Pour k=5k=5, il y a 3 voisins bleus.

La classe passe de bleu à rouge puis à bleu quand kk passe de 1 à 3 puis à 5 : le choix de kk influence le résultat. L'algorithme demande de connaître le nombre kk de voisins à considérer 3, et kk est généralement un petit entier positif 3. Un kk 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

★★☆Environ 10 min

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 k=3k=3 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
  1. Écarts de surface avec 58 m² : 1818 (40), 88 (50), 33 (55), 1212 (70), 3232 (90).

  2. Les trois plus petits écarts sont 33, 88 et 1212 : les appartements de 55, 50 et 70 m².

  3. Leurs prix sont 160, 150 et 215 k€.

  4. On fait la moyenne : 160+150+2153=5253=175\dfrac{160+150+215}{3}=\dfrac{525}{3}=175.

Le prix estimé est de 175 k€. En régression, la valeur prédite est la moyenne des valeurs des kk plus proches voisins 3. L'algorithme peut donc servir à autre chose que classer 2.

Exercice 6 Normaliser avant de comparer

★★☆Environ 15 min

Une personne QQ a 30 ans et gagne 2 000 € par mois. On la compare à deux personnes déjà classées :

Personne Âge (ans) Salaire (€/mois)
P1P_1 31 2 600
P2P_2 50 2 050
  1. Calcule la distance euclidienne de QQ à P1P_1 et à P2P_2 avec les valeurs brutes. Quel est le plus proche voisin ?
  2. 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 ?
  3. Donne la distance normalisée entre QQ et P1P_1 (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
  1. Valeurs brutes : QP1=12+6002≈600,0008QP_1=\sqrt{1^2+600^2}\approx 600{,}0008 et QP2=202+502=2900≈53,85QP_2=\sqrt{20^2+50^2}=\sqrt{2900}\approx 53{,}85. Le plus proche est P2P_2, alors qu'il a 20 ans de plus que QQ.

  2. Normalisation de l'âge : aˆge−2040\dfrac{\text{âge}-20}{40}. On obtient Q:0,25Q:0{,}25, P1:0,275P_1:0{,}275, P2:0,75P_2:0{,}75.

  3. Normalisation du salaire : salaire−10003000\dfrac{\text{salaire}-1000}{3000}. On obtient Q:0,3333Q:0{,}3333, P1:0,5333P_1:0{,}5333, P2:0,35P_2:0{,}35.

  4. Distances normalisées : QP1=0,0252+0,22≈0,2016QP_1=\sqrt{0{,}025^2+0{,}2^2}\approx 0{,}2016 et QP2=0,52+0,01672≈0,5003QP_2=\sqrt{0{,}5^2+0{,}0167^2}\approx 0{,}5003.

  5. Le plus proche voisin devient P1P_1. La distance normalisée QP1QP_1 vaut environ 0,20160{,}2016.

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

★★☆Environ 10 min

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 kk plus proches voisins, en calculant à chaque fois la distance du nouveau point à tous les points du jeu.

  1. Combien de distances le programme calcule-t-il au total ?
  2. Que devient ce nombre si le jeu de données double de taille ?
  3. 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
  1. Pour un nouveau point, la recherche naïve passe sur l'ensemble des nn points : 5 000 distances 4.

  2. Pour 200 nouveaux points : 5 000×200=1 000 0005\,000\times 200=1\,000\,000 distances.

  3. Si le jeu double (n=10 000n=10\,000), le total double aussi : 2 000 0002\,000\,000 distances. Le temps de calcul est linéaire en nn 4.

  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

★★★Environ 25 min

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 :

  1. distance(p, q) qui renvoie la distance euclidienne entre deux points du plan donnés par leurs coordonnées (x, y) ;
  2. k_plus_proches(donnees, x, k) qui renvoie la liste des kk couples (distance, classe) les plus proches du point x ;
  3. 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
  1. distance : on importe sqrt depuis le module math, puis on renvoie sqrt((p[0]-q[0])**2 + (p[1]-q[1])**2).

  2. k_plus_proches : on parcourt toutes les données (parcours séquentiel), on construit une liste liste de couples (distance(point, x), classe), on la trie avec liste.sort() et on renvoie liste[:k].

  3. classe_majoritaire : on parcourt les voisins en comptant les classes dans un dictionnaire effectifs, puis on parcourt les clés pour garder celle dont l'effectif est le plus grand.

  4. Test : avec x = (3, 2) et k = 3, les voisins sont ceux de l'exercice du vote (rouge, bleu, rouge), donc le programme renvoie "rouge".

  5. 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 kk plus proches, puis conclure par un vote 23. La version naïve parcourt les nn points, ce qui donne un temps linéaire en nn 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

★★★Environ 15 min

Pour choisir kk, 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 kk Points bien classés sur 8
1 5
3 7
5 6
  1. Quelle valeur de kk retiens-tu ?
  2. Quel est le taux de réussite correspondant, en pourcentage ?
  3. Pourquoi ne faut-il pas évaluer l'algorithme sur les points du jeu de données lui-même avec k=1k=1 ?
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
  1. Le meilleur résultat est 7 points bien classés sur 8, obtenu pour k=3k=3.

  2. Taux de réussite : 78×100=87,5 %\dfrac{7}{8}\times 100=87{,}5\ \%.

  3. Si l'on teste un point du jeu avec k=1k=1, 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.

  4. 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 k=3k=3, avec un taux de réussite de 87,5 %. Cette valeur est un petit entier, comme il est courant pour kk 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 ?

Parce qu'il ne construit aucun modèle à l'avance : il faut juste stocker le jeu de données labellisé 2. Tout le calcul (distances, tri, vote) se fait au moment de classer un nouvel objet. L'algorithme reste pourtant un apprentissage supervisé, car les données doivent être labellisées 2.

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 k=4k=4 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 kk 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

  1. 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.
  2. Algorithme des k plus proches voisins — Ressource Éduscol, Éduscol. Consulté le 6 novembre 2026.
  3. Méthode des k plus proches voisins, Wikipédia. Consulté le 6 novembre 2026.
  4. 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.

Signaler une erreur sur cette page

Je suis en…

Primaire

  • CP Bientôt
  • CE1 Bientôt
  • CE2 Bientôt
  • CM1 Bientôt
  • CM2 Bientôt

Collège

Lycée

Supérieur

  • BTS Bientôt
  • BUT Bientôt
  • Licence Bientôt
  • Prépas Bientôt

Sur cette page