Exercice 89 / 100

ML — Clustering KMeans

ConsigneSegmente des données avec K-Means

📖 Cours

K-Means est un algorithme de clustering non-supervisé : il regroupe les points en K clusters sans utiliser d'étiquettes.

Utilisé pour la segmentation client, la compression d'image, la détection de groupes naturels...

Fonctionnement (itératif)

1. choisir K centres aléatoires (centroids)2. assigner chaque point au centre le plus proche3. recalculer chaque centre = moyenne des points assignés4. répéter 2-3 jusqu'à stabilisation
K-Means tourne en boucle : chaque point rejoint le centre le plus proche, chaque centre se replace au milieu de ses points, et on recommence tant que les assignations changent
K-Means tourne en boucle : chaque point rejoint le centre le plus proche, chaque centre se replace au milieu de ses points, et on recommence tant que les assignations changent

Le résultat dépend de l'initialisation. Depuis scikit-learn 1.4, n_init vaut 'auto', c'est-à-dire une seule exécution avec k-means++ : écris explicitement n_init=10 pour que sklearn relance dix fois et garde la meilleure.

Workflow sklearn

from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=3, random_state=42, n_init=10)kmeans.fit(X)
kmeans.labels_ cluster assigné à chaque point (0, 1, 2)kmeans.cluster_centers_ coordonnées des K centreskmeans.inertia_ somme des distances² aux centres (à minimiser)kmeans.predict(X_new) cluster d'un nouveau point

Choisir K : la méthode du coude

Tester plusieurs K et regarder l'inertie :

inerties = []for k in range(1, 11): km = KMeans(n_clusters=k, n_init=10, random_state=42).fit(X) inerties.append(km.inertia_)

L'inertie diminue toujours avec K. On cherche le "coude" sur la courbe : le K à partir duquel ça ralentit.

Alternative : silhouette score.

Exemple complet

import numpy as npfrom sklearn.cluster import KMeans
np.random.seed(42)c1 = np.random.randn(50, 2) + [ 2, 2]c2 = np.random.randn(50, 2) + [-2, -2]c3 = np.random.randn(50, 2) + [ 2, -2]X = np.vstack([c1, c2, c3])
kmeans = KMeans(n_clusters=3, random_state=42, n_init=10).fit(X)
for i, c in enumerate(kmeans.cluster_centers_): print(f'Cluster {i}: ({c[0]:.2f}, {c[1]:.2f})')print(f'Inertie: {kmeans.inertia_:.2f}')print(f'Labels (nb par cluster): {np.bincount(kmeans.labels_)}')

Limites

- K doit être choisi à l'avance- sensible aux outliers- suppose des clusters sphériques de tailles similaires- sensible à l'échelle → standardiser les features

Alternatives selon la forme des clusters : dbscan (densité, gère le bruit), GaussianMixture (clusters elliptiques), AgglomerativeClustering (hiérarchique).

Envie d'aller plus loin ? Découvrez nos formations certifiées Bac+2 à Bac+5 →