Vue d'ensemble
Tu as une nuée de points sans aucune étiquette — des clients décrits par deux chiffres, des pixels d'une image, des relevés de mesure — et une seule intuition : « il doit y avoir des groupes là-dedans ». Les k-moyennes (en anglais k-means) sont l'algorithme phare pour faire émerger ces groupes tout seuls. C'est de l'apprentissage non supervisé : personne ne t'a dit à l'avance qui va avec qui, l'algorithme doit le découvrir.
L'idée tient en une phrase que l'on répète : chaque point rejoint le centre le plus proche, puis chaque centre se replace au milieu de sa troupe. On recommence jusqu'à ce que plus rien ne bouge.
Prérequis
- k plus proches voisins — surtout le calcul de la distance euclidienne entre deux points du plan.
- Tableaux 2D / images — manipuler des listes de coordonnées et parcourir des collections de points.
- Complexité temporelle — savoir compter les opérations d'une double boucle pour donner un .
Le clustering piège tout le monde à l'oral. On confond affectation et mise à jour, minimum local et global, supervisé et non supervisé. Nos mentors alumni X · Centrale · Mines t'entraînent à dérouler l'algorithme au tableau sans jamais te tromper d'étape.
Trouver un mentor →Partitionner sans étiquettes
En apprentissage supervisé (comme le k-NN), on connaît déjà la classe de chaque exemple d'entraînement : « ce point est un chat, celui-là un chien ». En apprentissage non supervisé, on n'a que des points nus, sans réponse. L'objectif change complètement : on ne cherche pas à prédire une étiquette connue, mais à faire apparaître une structure cachée.
Le partitionnement consiste à répartir un ensemble de points non étiquetés en groupes appelés clusters, de sorte que les points d'un même groupe se ressemblent (soient proches) et que deux groupes différents soient bien séparés. C'est une tâche d'apprentissage non supervisé.
Le centroïde d'un groupe de points est son barycentre : le point dont chaque coordonnée est la moyenne des coordonnées correspondantes des points du groupe. Pour un groupe de points dans le plan :
.
L'algorithme des k-moyennes
On fixe le nombre de groupes . L'algorithme :
- Initialisation : choisir centres de départ (par exemple points tirés au hasard).
- Répéter jusqu'à stabilisation :
- Affectation : associer chaque point au centre le plus proche (distance euclidienne).
- Mise à jour : remplacer chaque centre par le barycentre des points qui lui sont affectés.
On s'arrête quand les groupes (donc les centres) ne changent plus d'une itération à l'autre.
La brique de base : la distance
Tout repose sur « qui est le plus proche ». On mesure avec la distance euclidienne. Un point est un couple (x, y).
import math
def distance(p, q):
return math.sqrt((p[0] - q[0])**2 + (p[1] - q[1])**2)import mathon importe math pour disposer de math.sqrt, la racine carrée.def distance(p, q):on définit une fonction qui prend deux points p et q, chacun étant un couple (x, y).p[0] - q[0]écart des abscisses ; p[1] - q[1] fait de même pour les ordonnées.(...)**2on élève chaque écart au carré (pour supprimer les signes et pénaliser les grands écarts), puis on somme les deux carrés.math.sqrt(...)racine carrée de la somme : c'est exactement la longueur du segment entre p et q, par le théorème de Pythagore.Une itération complète
On code les deux phases pour centres c1 et c2. La phase d'affectation range chaque point dans g1 ou g2 ; la phase de mise à jour recalcule les barycentres.
def barycentre(groupe):
n = len(groupe)
sx = sum(p[0] for p in groupe)
sy = sum(p[1] for p in groupe)
return (sx / n, sy / n)
def une_iteration(points, c1, c2):
g1, g2 = [], []
for p in points: # phase d'AFFECTATION
if distance(p, c1) <= distance(p, c2):
g1.append(p)
else:
g2.append(p)
return barycentre(g1), barycentre(g2) # phase de MISE A JOURdef barycentre(groupe):calcule le centroïde d'une liste de points.n = len(groupe)nombre de points du groupe : ce sera le dénominateur de la moyenne.sx = sum(p[0] for p in groupe)somme de toutes les abscisses ; sy fait pareil pour les ordonnées.return (sx / n, sy / n)on divise chaque somme par n : on obtient le couple des deux moyennes, soit le barycentre.g1, g2 = [], []deux listes vides qui vont recevoir les points de chaque groupe.for p in points:on examine chaque point du nuage, un par un.if distance(p, c1) <= distance(p, c2):si p est au moins aussi proche de c1 que de c2, il rejoint g1. Le <= tranche les égalités en faveur de g1.g1.append(p) / g2.append(p)on range p dans le bon groupe.return barycentre(g1), barycentre(g2)une fois tous les points affectés, on renvoie les deux nouveaux centres : c'est la mise à jour.Déroulé pas à pas sur un exemple
Prenons 6 points du plan et . On lance l'algorithme avec deux centres de départ mal choisis (deux points proches, en bas à gauche) pour bien voir les centres se déplacer :
Points : . Centres initiaux : et .
| Itér. | c1 (avant) | c2 (avant) | Groupe 1 | Groupe 2 | Nouveau c1 | Nouveau c2 |
|---|---|---|---|---|---|---|
| 1 | (1 ; 1) | (1,5 ; 2) | {(1;1)} | {(1,5;2),(3;4),(5;7),(3,5;5),(4,5;5)} | (1 ; 1) | (3,5 ; 4,6) |
| 2 | (1 ; 1) | (3,5 ; 4,6) | {(1;1),(1,5;2)} | {(3;4),(5;7),(3,5;5),(4,5;5)} | (1,25 ; 1,5) | (4 ; 5,25) |
| 3 | (1,25 ; 1,5) | (4 ; 5,25) | {(1;1),(1,5;2)} | {(3;4),(5;7),(3,5;5),(4,5;5)} | (1,25 ; 1,5) ✓ | (4 ; 5,25) ✓ |
À l'itération 3, les groupes sont identiques à ceux de l'itération 2, donc les barycentres ne bougent plus : les centres renvoyés sont égaux à ceux d'entrée. C'est le critère d'arrêt : plus aucun point ne change de groupe. On lit le résultat final : un petit cluster en bas à gauche et un gros cluster en haut à droite.
Convergence et minimum local
Pourquoi l'algorithme finit-il toujours par s'arrêter ? On mesure la qualité d'un partitionnement par son inertie intra-classe : la somme, sur tous les points, du carré de la distance de chaque point au centre de son groupe. Plus elle est petite, plus les groupes sont compacts.
.
À chaque itération, la phase d'affectation ne peut que faire baisser (ou laisser égale) l'inertie, car on réaffecte chaque point à un centre au moins aussi proche ; et la phase de mise à jour aussi, car le barycentre est le point qui minimise la somme des carrés des distances aux points de son groupe. L'inertie décroît donc à chaque étape. Comme il n'existe qu'un nombre fini de partitions possibles des points en groupes, cette suite décroissante finit par se stabiliser : l'algorithme converge en un nombre fini d'itérations.
« Minimum local vs global » est LA question de colle. Savoir expliquer pourquoi l'inertie décroît, et pourquoi ça ne suffit pas à garantir l'optimum, fait la différence. Nos mentors alumni X · Centrale · Mines te font verbaliser l'argument proprement.
Trouver un mentor →Choix de k et coût
Comment choisir k ?
Le nombre de groupes est un paramètre d'entrée : c'est toi qui le fixes, l'algorithme ne le devine pas. Parfois le contexte l'impose (segmenter une clientèle en 3 profils). Sinon, une heuristique classique — la méthode du coude — consiste à tracer l'inertie finale en fonction de : elle diminue toujours quand augmente, mais on repère le « coude » à partir duquel gagner un groupe de plus ne fait presque plus baisser l'inertie. Ce est un bon compromis.
Complexité d'une itération
À chaque itération, la phase coûteuse est l'affectation : pour chacun des points, on calcule sa distance à chacun des centres pour trouver le plus proche. Cela fait calculs de distance.
Une itération est donc en calculs de distance (chaque calcul étant lui-même en en dimension fixée). La mise à jour, elle, parcourt une fois les points pour cumuler les barycentres, soit : elle est négligeable devant l'affectation. Sur itérations, le coût total est .
Ne pas confondre k-moyennes et k-NN
Les deux commencent par « k » et parlent de distance euclidienne : d'où la confusion. Mais ce sont deux mondes différents.
| Critère | k-moyennes (k-means) | k plus proches voisins (k-NN) |
|---|---|---|
| Type d'apprentissage | Non supervisé | Supervisé |
| Données | Points SANS étiquette | Points AVEC étiquette connue |
| Ce que « k » désigne | Nombre de groupes à former | Nombre de voisins à consulter |
| But | Partitionner : découvrir des groupes | Classer un nouveau point selon ses voisins |
| Ce qu'on calcule | Des centres (barycentres) qui bougent | Aucun centre : on regarde les k voisins les plus proches |
| Itératif ? | Oui, jusqu'à stabilisation | Non : une requête = un vote des voisins |
Exercices corrigés
Un groupe contient les points . Donne son centroïde (barycentre).
Voir la correction détaillée
On a deux centres et , et les points . Effectue la phase d'affectation, puis calcule les deux nouveaux centres.
Voir la correction détaillée
On dispose des points alignés, et . (a) Avec les centres initiaux et , vers quel partitionnement converge-t-on ? (b) Même question avec les centres initiaux et . (c) Que conclus-tu ?
Voir la correction détaillée
Récap final — Ce qu'il faut absolument retenir
Les k-moyennes : un aller-retour affectation / mise à jour jusqu'à ce que plus rien ne bouge. Vérifie que tu maîtrises chaque point.
- Sais-tu dire pourquoi les k-moyennes relèvent de l'apprentissage non supervisé (points sans étiquette) ?
- Sais-tu énoncer les deux phases répétées : affectation au centre le plus proche, puis mise à jour par le barycentre ?
- Sais-tu calculer un barycentre (moyenne coordonnée par coordonnée) sans hésiter ?
- Sais-tu dérouler l'algorithme à la main sur un petit nuage 2D avec ?
- Sais-tu quel est le critère d'arrêt (les groupes ne changent plus) ?
- Sais-tu expliquer que l'inertie décroît et que l'algorithme converge vers un minimum local dépendant de l'initialisation ?
- Sais-tu donner la complexité d'une itération, calculs de distance, et dire d'où vient le ?
- Sais-tu distinguer k-moyennes (k centres, non supervisé) de k-NN (k voisins, supervisé) ?