<?xml version="1.0" encoding="UTF-8"?>

<upm-export>
	<title>Enseignement de l&#039;informatique et du numérique au lycée Boissy d&#039;Anglas</title>
	<link>https://icn-isn-boissy.yj.fr/wp</link>
	<description></description>
	<pubDate>Wed May 6 11:58:49 2026 / +0000  GMT</pubDate>
	<generator>Universal Post Manager 1.1.2 [ www.ProfProjects.com ] </generator>
	<language></language>
	
			<item>
			<title>Algorithme des k plus proches voisins</title>
			<link>https://icn-isn-boissy.yj.fr/wp/?p=2745</link>
			<pubDate>Wed May 6 11:58:49 2026 / +0000  GMT</pubDate>
			<guid isPermaLink="false">https://icn-isn-boissy.yj.fr/wp/?p=2745</guid>
			<content-encoded><![CDATA[<!-- wp:list {"ordered":true} -->
<ol><!-- wp:list-item -->
<li>Introduction<br>L'algorithme des k plus proches voisins appartient à la famille des algorithmes d'apprentissage automatique (machine learning).<br>L'idée d'apprentissage automatique ne date pas d'hier, puisque le terme de machine learning a été utilisé pour la première fois par<br>l'informaticien américain Arthur Samuel en 1959. Les algorithmes d'apprentissage automatique ont connu un fort regain d'intérêt<br>au début des années 2000 notamment grâce à la quantité de données disponibles sur internet.<br>L'algorithme des k plus proches voisins est un algorithme d'apprentissage supervisé, il est nécessaire d'avoir des données labellisées. À partir d'un ensemble E de données labellisées, il sera possible de classer (déterminer le label) d'une nouvelle donnée (donnée n'appartenant pas à E). À noter qu'il est aussi possible d'utiliser l'algorithme des k plus proches voisins à des fins de régression (on cherche à déterminer une valeur à la place d'une classe), mais cet aspect des choses ne sera pas abordé ici. L'algorithme des k plus proches voisins est une bonne introduction aux principes des algorithmes d'apprentissage automatique, il est en effet relativement simple à appréhender (l'explication donnée aux élèves peut être très visuelle). Cette première approche des algorithmes d'apprentissage peut aussi amener les élèves à réfléchir sur l'utilisation de leurs données personnelles (même si ce sujet a déjà abordé auparavant) : de nombreuses sociétés (exemple les GAFAM) utilisent les données concernant leurs utilisateurs afin de ”nourrir” des algorithmes de machine learning qui permettront à ces sociétés d'en savoir toujours plus sur nous et ainsi de mieux cerné nos ”besoins” en termes de consommation.</li>
<!-- /wp:list-item --></ol>
<!-- /wp:list -->

<!-- wp:list {"ordered":true,"start":2} -->
<ol start="2"><!-- wp:list-item -->
<li>Principe de l'algorithme<br>L'algorithme de k plus proches voisins ne nécessite pas de phase d'apprentissage à proprement parler, il faut juste stocker le jeu de<br>données d'apprentissage.<br>Soit un ensemble E contenant n données labellisées : E = {(yi<br>, x⃗i)} avec i compris entre 1 et n, où yi correspond à la classe<br>(le label) de la donnée i et où le vecteur x⃗i de dimension p (x⃗i = (x1i<br>, x2i, …, xpi)) représente les variables prédictrices de la donnée i. Soit une donnée u qui n'appartient pas à E et qui ne possède pas de label (u est uniquement caractérisée par un vecteur x⃗u de dimension p). Soit d une fonction qui renvoie la distance entre la donnée u et une donnée quelconque appartenant à E. Soit un entier k inférieur ou égal à n. Voici le principe de l'algorithme de k plus proches voisins :<br>▷ On calcule les distances entre la donnée u et chaque donnée appartenant à E à l'aide de la fonction d<br>▷ On retient les k données du jeu de données E les plus proches de u<br>▷ On attribue à u la classe qui est la plus fréquente parmi les k données les plus proches.</li>
<!-- /wp:list-item --></ol>
<!-- /wp:list -->

<!-- wp:list {"ordered":true,"start":3} -->
<ol start="3"><!-- wp:list-item -->
<li>Étude d'un exemple<br>3.1. Les données<br>Nous avons choisi ici de nous baser sur le jeu de données ”iris de Fisher” (il existe de nombreuses autres possibilités). Ce jeu de<br>données est composé de 50 entrées, pour chaque entrée nous avons :<br>▷ la longueur des sépales (en cm)<br>▷ la largeur des sépales (en cm)<br>▷ la longueur des pétales (en cm)<br>▷ la largeur des pétales (en cm)<br>▷ l'espèce d'iris : Iris setosa, Iris virginica ou Iris versicolor (label)<br>Il est possible de télécharger ces données au format csv, par exemple sur le site <a href="https://gist.github.com/curran/a08a1080b88344b0c8a7">GitHub Gist</a> ou en le téléchargeant <a href="https://icn-isn-boissy.yj.fr/wp/wp-content/uploads/2020/05/iris.csv">ici</a><br>Une fois ces données téléchargées, Il est nécessaire de les modifier à l'aide d'un tableur :<br>▷ dans un souci de simplification, nous avons choisi de travailler uniquement sur la taille des pétales, nous allons donc supprimer les colonnes ”sepal_length” et ”sepal_width”<br>▷ il est nécessaire d'encoder les espèces avec des chiffres : 0 pour Iris setosa, 1 pour Iris virginica et 2 pour Iris versicolor (ce<br>processus d'encodage des données textuelles est relativement classique en apprentissage automatique).<br>3.2. Bibliothèques Python utilisées<br>Nous allons utiliser 3 bibliothèques Python :<br>▷ Pandas [3] qui va nous permettre d'importer les données issues du fichier csv<br>▷ Matplotlib [4] qui va nous permettre de visualiser les données (tracer des graphiques)<br>▷ Scikit-learn [5] qui propose une implémentation de l'algorithme des k plus proches voisins.<br>Ces bibliothèques sont facilement installables notamment en utilisant la distribution Anaconda (ou Miniconda).<br>3.3. Première visualisation des données<br>Une fois le fichier csv modifié, il est possible d'écrire un programme permettant de visualiser les données sous forme de graphique<br>(abscisse : ”petal_length”, ordonnée : ”petal_width”) :<br></li>
<!-- /wp:list-item --></ol>
<!-- /wp:list -->

<!-- wp:file {"id":3524,"href":"https://icn-isn-boissy.yj.fr/wp/wp-content/uploads/2020/09/iris.csv"} -->
<div class="wp-block-file"><a id="wp-block-file--media-2e1b3220-ac79-402a-ae1d-f72e5026e942" href="https://icn-isn-boissy.yj.fr/wp/wp-content/uploads/2020/09/iris.csv">iris</a><a href="https://icn-isn-boissy.yj.fr/wp/wp-content/uploads/2020/09/iris.csv" class="wp-block-file__button wp-element-button" download aria-describedby="wp-block-file--media-2e1b3220-ac79-402a-ae1d-f72e5026e942">Télécharger</a></div>
<!-- /wp:file -->

<!-- wp:code -->
<pre class="wp-block-code"><code>import pandas
import matplotlib.pyplot as plt
iris=pandas.read_csv("iris.csv")
x=iris.loc&#91;:,"petal_length"]
y=iris.loc&#91;:,"petal_width"]
lab=iris.loc&#91;:,"species"]
plt.scatter(x&#91;lab == 0], y&#91;lab == 0], color='g', label='setosa')
plt.scatter(x&#91;lab == 1], y&#91;lab == 1], color='r', label='virginica')
plt.scatter(x&#91;lab == 2], y&#91;lab == 2], color='b', label='versicolor')
plt.scatter(2.5, 0.75, color='k')
plt.legend()
plt.show()
</code></pre>
<!-- /wp:code -->

<!-- wp:image {"id":2746,"sizeSlug":"large"} -->
<figure class="wp-block-image size-large"><img src="https://icn-isn-boissy.yj.fr/wp/wp-content/uploads/2020/05/k1.png" alt="FIGURE 1 – Représentation graphique des données" class="wp-image-2746"/><figcaption class="wp-element-caption">FIGURE 1 – Représentation graphique des données</figcaption></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>3.4. Utilisation de l'algorithme des k plus proches voisins Le graphique ci-dessus (figure 1) montre que les 3 classes (Iris setosa, Iris virginica et Iris versicolor) sont relativement bien séparées. On peut alors ajouter une donnée non labellisée n'appartenant pas à l'ensemble d'origine (voir figure 2) :</p>
<!-- /wp:paragraph -->

<!-- wp:image {"id":2747,"sizeSlug":"large"} -->
<figure class="wp-block-image size-large"><img src="https://icn-isn-boissy.yj.fr/wp/wp-content/uploads/2020/05/k2.png" alt="" class="wp-image-2747"/><figcaption class="wp-element-caption">FIGURE 2 – Ajout d'une donnée non labellisée</figcaption></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>Dans l'exemple ci-dessus (figure 2) les élèves n'auront aucune difficulté à déterminer l'espèce de l'iris qui a été ajouté au jeu de données.<br>Dans certains cas (exemple : largeur pétale = 0,75 cm ; longueur pétale = 2,5 cm) il est un peu plus difficile de se prononcer ”au premier coup d'oeil” (voir figure 3) :</p>
<!-- /wp:paragraph -->

<!-- wp:image {"id":2748,"sizeSlug":"large"} -->
<figure class="wp-block-image size-large"><img src="https://icn-isn-boissy.yj.fr/wp/wp-content/uploads/2020/05/k3.png" alt="" class="wp-image-2748"/><figcaption class="wp-element-caption">FIGURE 3 – Cas plus difficile…</figcaption></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p><br><br>À partir de l'exemple ci-dessus (voir figure 3), il est possible de demander aux élèves de proposer une méthode permettant de traiter<br>ce genre de cas litigieux. L'enseignant peut, grâce à une série de ”questions-réponses”, amener doucement les élèves à la solution<br>proposée par l'algorithme des k plus proches voisins :<br>▷ on calcule la distance entre notre point (largeur du pétale = 0,75 cm ; longueur du pétale = 2,5 cm) et chaque point issu du<br>jeu de données ”iris” (à chaque fois c'est un calcul de distance entre 2 points tout ce qu'il y a de plus classique) ;<br>▷ on sélectionne uniquement les k distances les plus petites (les k plus proches voisins) ;<br><br>▷ parmi les k plus proches voisins, on détermine quelle est l'espèce majoritaire. On associe à notre ”iris mystère” cette ”espèce<br>majoritaire parmi les k plus proches voisins”.<br>Dans l'exemple évoqué ci-dessus (largeur pétale = 0,75 cm ; longueur pétale = 2,5 cm), pour k=3, nous obtenons graphiquement :</p>
<!-- /wp:paragraph -->

<!-- wp:image {"id":2749,"sizeSlug":"large"} -->
<figure class="wp-block-image size-large"><img src="https://icn-isn-boissy.yj.fr/wp/wp-content/uploads/2020/05/k4.png" alt="" class="wp-image-2749"/><figcaption class="wp-element-caption">FIGURE 4 – 3 plus proches voisins dans le cas : largeur pétale = 0,75 cm ; longueur pétale = 2,5 cm</figcaption></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>Un iris ayant une largeur de pétale égale à 0,75 cm et une longueur de pétale égale à 2,5 cm a une ”forte” probabilité (cette notion<br>de probabilité d'obtenir un résultat correct grâce à cet algorithme, bien que très intéressante, pourra difficilement être abordée avec<br>des élèves de première) d'appartenir à l'espèce setosa.</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p>3.5. Utilisation de scikit-learn <em><strong>(à installer si absente de votre éditeur)</strong></em><br>La bibliothèque Python scikit-learn propose un grand nombre d'algorithmes lié à l'apprentissage automatique (c'est sans aucun<br>doute la bibliothèque la plus utilisée en apprentissage automatique). Parmi tous ces algorithmes, scikit-learn propose l'algorithme<br>des k plus proches voisins. Voici un programme Python permettant de résoudre le problème évoqué ci-dessus (largeur pétale = 0,75<br>cm ; longueur pétale = 2,5 cm) :</p>
<!-- /wp:paragraph -->

<!-- wp:code -->
<pre class="wp-block-code"><code>import pandas
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier

#traitement CSV
iris=pandas.read_csv("iris.csv")
x=iris.loc&#91;:,"petal_length"]
y=iris.loc&#91;:,"petal_width"]
lab=iris.loc&#91;:,"species"]
#fin traitement CSV

#valeurs
longueur=2.5
largeur=0.75
k=3
#fin valeurs

#graphique
plt.scatter(x&#91;lab == 0], y&#91;lab == 0], color='g', label='setosa')
plt.scatter(x&#91;lab == 1], y&#91;lab == 1], color='r', label='virginica')
plt.scatter(x&#91;lab == 2], y&#91;lab == 2], color='b', label='versicolor')
plt.scatter(longueur, largeur, color='k')
plt.legend()
#fin graphique

#algo knn
d=list(zip(x,y))
model = KNeighborsClassifier(n_neighbors=k)
model.fit(d,lab)
prediction= model.predict(&#91;&#91;longueur,largeur]])
#fin algo knn

#Affichage résultats
txt="Résultat : "
if prediction&#91;0]==0:
    txt=txt+"setosa"
if prediction&#91;0]==1:
    txt=txt+"virginica"
if prediction&#91;0]==2:
    txt=txt+"versicolor"
plt.text(3,0.5, f"largeur : {largeur} cm longueur : {longueur} cm", fontsize=12)
plt.text(3,0.3, f"k : {k}", fontsize=12)
plt.text(3,0.1, txt, fontsize=12)
#fin affichage résultats

plt.show()
</code></pre>
<!-- /wp:code -->

<!-- wp:paragraph -->
<p>Nous obtenons le résultat suivant (voir figure 5) :</p>
<!-- /wp:paragraph -->

<!-- wp:image {"id":2750,"sizeSlug":"large"} -->
<figure class="wp-block-image size-large"><img src="https://icn-isn-boissy.yj.fr/wp/wp-content/uploads/2020/05/k5.png" alt="" class="wp-image-2750"/><figcaption class="wp-element-caption">FIGURE 5 – 3 plus proches voisins à l'aide de scikit-learn dans le cas : largeur pétale = 0,75 cm ; longueur pétale = 2,5 cm<br></figcaption></figure>
<!-- /wp:image -->

<!-- wp:paragraph -->
<p>Il est ensuite possible de demander aux élèves de m le programme ci-dessus afin d'étudier les changements induits par la<br>modification du paramètre k (notamment pour k=5) en gardant toujours les mêmes valeurs de largeur et de longueur (largeur pétale<br>= 0,75 cm ; longueur pétale = 2,5 cm).<br>Pour terminer, il est aussi possible de demander aux élèves de travailler avec d'autres valeurs de longueur et largeur.</p>
<!-- /wp:paragraph -->

<!-- wp:list {"ordered":true,"start":4} -->
<ol start="4"><!-- wp:list-item -->
<li>Possibilité de projet<br>Il est possible, dans le cadre d'un projet, de faire travailler les élèves sur un autre jeu de données, par exemple, ”Prédire les survivants<br>du Titanic”. Le jeu de données peut être récupéré sur le site kaggle [6]. Le label est ”survivant” ou ”décédé”. Il sera nécessaire de<br>retravailler les données comme nous l'avons fait pour le jeu de données ”Iris” (supprimer des colonnes, encodage…). Dans ce projet<br>il sera possible de faire travailler les élèves sur des vecteurs d'entrée de dimension supérieure à 2 (le genre, l'âge, la classe occupée<br>par le passager sur le bateau, …).</li>
<!-- /wp:list-item --></ol>
<!-- /wp:list -->

<!-- wp:paragraph -->
<p>voici un lien vers le projet Titanic développé par Benoit Fourlegnie:</p>
<!-- /wp:paragraph -->

<!-- wp:paragraph -->
<p><a href="https://icn-isn-boissy.yj.fr/wp/2022/03/07/projet-chance-du-survivre-au-naufrage-du-titanic/">projet titanic</a></p>
<!-- /wp:paragraph -->]]></content-encoded>
			<excerpt-encoded><![CDATA[]]></excerpt-encoded>
			<wp-post_id>2745</wp-post_id>
			<wp-post_date>2020-09-14 16:11:03</wp-post_date>
			<wp-post_date_gmt>2020-09-14 14:11:03</wp-post_date_gmt>
				</item>
</upm-export>
