Menu
CoddyTech

La méthode du coude

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

Tracez l’inertie en fonction de k. Tant que chaque nouveau centre divise un groupe réel, l’inertie chute fortement ; puis elle s’aplatit. Le coude, l’elbow, est une bonne valeur de k :

Deux courbes d’inertie pour k from 1 to 8. À gauche, les pommes : une forte baisse jusqu’à k = 3, puis une courbe presque plate, avec une ligne pointillée à 3. À droite, des points sans groupes : une courbe lisse sans coude

Une règle empirique : arrêtez-vous lorsqu’un centre supplémentaire réduit l’inertie de moins d’un quart. Les réductions obtenues avec les pommes : 56 %, puis 69 %, puis seulement 15 %. Donc k = 3 :

ax.plot(ks, inertias, marker="o")
ax.axvline(3, linestyle="--")

Une courbe douce sans coude ne révèle pas de groupes distincts. La prochaine leçon introduit un deuxième juge.

challenge icon

Défi

Facile

Une application pour plantes classe les plantes d’intérieur en plans d’entretien selon leurs besoins en lumière et en eau. Le code de départ contient des inerties pour k from 1 to 8, un graphique et cutoff.

  1. En partant de k = 1 et en augmentant, arrête-toi lorsque le k suivant réduit l’inertie de moins de cutoff. Affiche ce k.
  2. Trace l’inertie en fonction de k avec des points, une ligne verticale en tirets à ton k, puis affiche le graphique.

Pour une autre application, cutoff 0.25 :

Care plans: 3

Une courbe d’inertie intitulée Elbow: Care Plans pour k from 1 to 8, avec un point à chaque k : une forte baisse jusqu’à k = 3, puis une courbe presque plate, et une ligne verticale en tirets à 3

Coddy décrit ensuite ton graphique.

Essayez vous-même

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

# Ne modifiez pas les lignes ci-dessous
rng = np.random.default_rng(17)
# Quatre types de plantes : besoins habituels en lumière et en eau, et nombre de plantes
kinds = [(8.5, 2, 35), (2.5, 7.5, 30), (5, 5, 30), (8, 8, 25)]
parts = []
for l, w, n in kinds:
    parts.append(np.column_stack([rng.normal(l, 0.8, n), rng.normal(w, 0.8, n)]))
# 120 plantes d’intérieur, une par ligne : besoins en lumière et en eau, notés de 1 à 10
plants = np.clip(np.round(np.concatenate(parts), 1), 1, 10)

# Inertie pour k = 1 à 8, à partir de Inertia
ks = list(range(1, 9))
inertias = []
for k in ks:
    km = KMeans(n_clusters=k, n_init=10, random_state=0)
    km.fit(plants)
    inertias.append(km.inertia_)

cutoff = float(input())
fig, ax = plt.subplots()
ax.set_title("Elbow: Care Plans")
ax.set_xlabel("k")
ax.set_ylabel("Inertia")

# É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