K-Means à la main
Fait partie de la section Apprentissage non supervisé du Journey Machine Learning de Coddy. Leçon 3 sur 51.
K-means répète un tour de deux étapes pour trouver k groupes. Affectation : chaque point rejoint le centre le plus proche. Déplacement : chaque centre se déplace vers la moyenne de ses points. Trois stands de glaces :
Un tour dans NumPy, où dists est un tableau de distances avec une colonne par centre :
labels = dists.argmin(axis=1) # attribuer
for c in range(k):
centers[c] = X[labels == c].mean(axis=0) # déplacerargmin(axis=1) donne la colonne la plus petite de chaque ligne : son centre le plus proche. Tour après tour, les centres se stabilisent ; lorsqu’aucun ne bouge, l’algorithme k-means est terminé.
Défi
FacileUn fabricant de T-shirts adapte ses tailles S, M et L à sa clientèle actuelle. Son ancien tableau des tailles fournit les centres de départ, distances(people, centers) donne le tableau des distances, et le programme lit le nombre de tours à effectuer.
- À chaque tour : attribuez une taille à chaque personne, puis déplacez chaque centre.
- Affichez le centre de chaque taille et le nombre de personnes qui lui ont été attribuées au dernier tour, comme ci-dessous.
Pour un autre fabricant :
Rounds run: 2
S: chest 87.3 cm, length 65.1 cm, 14 people
M: chest 95.0 cm, length 68.9 cm, 31 people
L: chest 104.8 cm, length 72.6 cm, 45 peopleEssayez vous-même
import numpy as np
# Ne modifiez pas les lignes ci-dessous
rng = np.random.default_rng(12)
chest = np.concatenate([rng.normal(88, 3, 30), rng.normal(98, 3.5, 35), rng.normal(110, 4, 25)])
length = np.concatenate([rng.normal(66, 1.8, 30), rng.normal(70, 2, 35), rng.normal(75, 2.2, 25)])
# 90 clients, une ligne par client : tour de poitrine et longueur en cm
people = np.round(np.column_stack([chest, length]), 1)
# L'ancien tableau des tailles définit les centres initiaux : S, M, L
sizes = ["S", "M", "L"]
centers = np.array([[85.0, 64.0], [90.0, 67.0], [96.0, 69.0]])
rounds = int(input())
# Tableau des distances : une ligne par personne, une colonne par centre
def distances(X, centers):
table = np.zeros((len(X), len(centers)))
for c in range(len(centers)):
table[:, c] = np.sqrt(((X - centers[c]) ** 2).sum(axis=1))
return table
# Écrivez votre code ci-dessous
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é
1Découvrir des groupes
Apprendre sans étiquettesMesurer la similaritéK-Means à la mainK-Means avec scikit-learnRécapitulatif : les membres de la salle de sport4Classification hiérarchique
Fusion étape par étapeModèles agglomératifsDendrogrammesRécapitulatif : races de chiens7L’ACP en pratique
Visualiser 64 dimensionsLes composantes comme motifsCompresser et reconstruireL’ACP avant un modèleRécapitulatif : scanner de visages10Projet : Explorateur de chiffres
Observer les chiffresRéduire avec la PCARegrouper les chiffresNommer les groupesRepérer les intrus2Choisir k
InertieLa méthode du coudeScores de silhouetteMettre à l’échelle avant le clusteringRécapitulatif : zones de livraisonEntraînez-vous par vous-même : Compilateur Python en ligne