Menu
CoddyTech

Quand K-Means échoue

Fait partie de la section Apprentissage non supervisé du Journey Machine Learning de Coddy. Leçon 14 sur 51.

K-means représente chaque cluster comme une boule ronde autour de son centre. Les fléchettes forment une cible avec un anneau autour, et k-means les coupe en deux :

Deux graphiques représentant 140 fléchettes. À gauche, la réalité : un groupe compact formant une cible à l’intérieur d’un large anneau. À droite, k-means avec k = 2 : une bordure droite en pointillés divise la cible, l’anneau et le centre en une moitié gauche et une moitié droite, chacune avec une croix au centre

Chaque point est associé à son centre le plus proche, donc la frontière entre deux groupes est une droite située à mi-chemin entre les centres. Aucune droite ne sépare un anneau de son milieu.

Les groupes longs, courbés ou très irréguliers posent le même problème à k-means. Il renvoie quand même des groupes, alors regarde toujours le graphique.

challenge icon

Défi

Moyen

Un drone a repéré 200 phoques sur deux bancs de sable incurvés. Le code de démarrage dessine la vérité sur le panneau left.

  1. Regroupe les phoques avec k-means, k = 2.
  2. Sur le panneau right, affiche chaque groupe en nuage de points, étiqueté cluster 0 ou cluster 1.
  3. Marque les centres avec des marqueurs noirs "X" étiquetés centers. Ajoute une légende, puis affiche le graphique.

Coddy décrit ton graphique et compte les phoques qui sont restés avec leur propre banc de sable. Comme ici, pour deux groupes :

Deux graphiques. À gauche, la vérité : un grand groupe dispersé et un petit groupe compact à sa droite. À droite, k-means avec k = 2 : le groupe du petit rassemblement inclut aussi le bord droit du grand groupe, et des croix noires marquent les deux centres

Essayez vous-même

import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.cluster import KMeans

# 200 phoques se reposant sur deux bancs de sable incurvés, vus depuis un drone (positions en 100 m)
X, sandbar = make_moons(n_samples=200, noise=0.07, random_state=4)


# Trace les véritables bancs de sable sur ax
def draw_truth(ax):
    ax.scatter(X[sandbar == 0, 0], X[sandbar == 0, 1], s=12, label="north bar")
    ax.scatter(X[sandbar == 1, 0], X[sandbar == 1, 1], s=12, label="south bar")
    ax.set_title("The truth")
    ax.legend()


fig, (left, right) = plt.subplots(1, 2, figsize=(9, 4))
draw_truth(left)
right.set_title("K-means, k = 2")

# Écrivez votre code ci-dessous
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Apprentissage non supervisé

Entraînez-vous par vous-même : Compilateur Python en ligne