Similarité cosinus et clustering k-means en Python
L'apprentissage non supervisé trouve une structure dans des données sans étiquettes. La similarité cosinus mesure à quel point deux vecteurs se ressemblent, et k-means regroupe les points en clusters autour de centres qu'il apprend.
Le concept en termes simples
L'apprentissage non supervisé trouve une structure dans des données sans étiquettes. La similarité cosinus mesure à quel point deux vecteurs se ressemblent, et k-means regroupe les points en clusters autour de centres qu'il apprend.
Mesurez la ressemblance de deux vecteurs avec la similarité cosinus et regroupez des données non étiquetées avec k-means.
Idées clés
- La similarité cosinus ignore la longueur et ne compare que la direction, ce qui convient au texte et aux embeddings.
- k-means a besoin du nombre de clusters k dès le départ.
- Les centres de départ peuvent changer le résultat, c'est pourquoi on lance souvent k-means plusieurs fois.
- Les clusters viennent des seules données ; aucune étiquette n'est nécessaire.
Quand l’utiliser ?
- Comprendre ce qui se passe à l'intérieur des réseaux de neurones et des bibliothèques d'IA.
- Apprendre l'idée avant de l'implémenter dans les défis correspondants.
- Se préparer aux cours d'apprentissage automatique, aux entretiens et aux projets.
À vous de jouer
Appuyez sur Étape pour alterner les deux étapes de k-means, ou sur Lecture pour les répéter jusqu'à ce que plus rien ne change. Tournez les vecteurs à droite pour changer leur similarité cosinus.
Code d’exemple
import math
# Cosine similarity compares directions: 1 = same direction, 0 = unrelated.
def cosine(a, b):
dot = sum(x * y for x, y in zip(a, b))
return dot / (math.sqrt(sum(x * x for x in a)) * math.sqrt(sum(y * y for y in b)))
print("cos(doc1, doc2):", round(cosine([1, 2, 0], [2, 4, 0]), 3))
print("cos(doc1, doc3):", round(cosine([1, 2, 0], [0, 0, 3]), 3))
# k-means: assign points to the nearest centre, then move each centre to its points' mean.
points = [1, 2, 3, 10, 11, 12]
centres = [1.0, 2.0]
for step in range(1, 4):
groups = [[], []]
for p in points:
nearest = min(range(len(centres)), key=lambda i: abs(p - centres[i]))
groups[nearest].append(p)
centres = [sum(g) / len(g) for g in groups]
print(f"step {step}: centres={[round(c, 2) for c in centres]} groups={groups}")
Résultat attendu
cos(doc1, doc2): 1.0
cos(doc1, doc3): 0.0
step 1: centres=[1.0, 7.6] groups=[[1], [2, 3, 10, 11, 12]]
step 2: centres=[2.0, 11.0] groups=[[1, 2, 3], [10, 11, 12]]
step 3: centres=[2.0, 11.0] groups=[[1, 2, 3], [10, 11, 12]]
Fonctionnement
cosine() divise le produit scalaire par les longueurs des deux vecteurs, donc doc2 (même direction que doc1) obtient 1 et doc3 (aucun mot commun) obtient 0. k-means répète deux étapes, affecter chaque point à son centre le plus proche puis déplacer chaque centre vers la moyenne de ses points. Plus rien ne change après l'étape 2, donc l'algorithme a convergé.
Modifiez les valeurs et exécutez le programme avec le compilateur Python en ligne CodeUtility, sans installation locale.
Exercices pratiques
Modifiez les entrées et testez les cas limites avant d’utiliser des données plus volumineuses.
- Modifiez les entrées ou les poids et prédisez la sortie avant d'exécuter.
- Affichez les valeurs intermédiaires pour suivre chaque étape du calcul.
- Résolvez les défis liés ci-dessous pour implémenter l'idée vous-même.
S'entraîner avec un défi
Utilisez le contenu de cette leçon pour résoudre un vrai problème. Chaque défi s'exécute dans le navigateur, avec des tests instantanés et une revue par l'IA.
- Similarité cosinus Mesurez la ressemblance de deux vecteurs par l'angle qui les sépare, comme les moteurs de recherche avec les embeddings. Facile
- Partitionnement k-means Regroupez des points en k clusters en les assignant au centroïde le plus proche puis en déplaçant les centroïdes, plusieurs fois. Moyen