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...
1. choisir K centres aléatoires (centroids)
2. assigner chaque point au centre le plus proche
3. recalculer chaque centre = moyenne des points assignés
4. répéter 2-3 jusqu'à stabilisationLe résultat dépend de l'initialisation. Par défaut, sklearn lance l'algo n_init=10 fois et garde la meilleure exécution.
from sklearn.cluster import KMeanskmeans = 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 centres
kmeans.inertia_ somme des distances² aux centres (à minimiser)
kmeans.predict(X_new) cluster d'un nouveau pointTester 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.
import numpy as np
from sklearn.cluster import KMeansnp.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_)}')- K doit être choisi à l'avance
- sensible aux outliers
- suppose des clusters sphériques de tailles similaires
- sensible à l'échelle → standardiser les featuresAlternatives 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 →