KI-Konzepte in Python

Kosinus-Ähnlichkeit und k-Means-Clustering in Python

Unüberwachtes Lernen findet Strukturen in Daten ohne Labels. Die Kosinus-Ähnlichkeit misst, wie ähnlich sich zwei Vektoren sind, und k-Means gruppiert Punkte in Cluster um Zentren, die es selbst lernt.

Das Konzept in einfachen Worten

Unüberwachtes Lernen findet Strukturen in Daten ohne Labels. Die Kosinus-Ähnlichkeit misst, wie ähnlich sich zwei Vektoren sind, und k-Means gruppiert Punkte in Cluster um Zentren, die es selbst lernt.

Miss mit der Kosinus-Ähnlichkeit, wie ähnlich zwei Vektoren sind, und gruppiere unbeschriftete Daten mit k-Means.

Die wichtigsten Ideen

  • Die Kosinus-Ähnlichkeit ignoriert die Länge und vergleicht nur die Richtung, was gut zu Texten und Embeddings passt.
  • k-Means braucht die Anzahl der Cluster k im Voraus.
  • Die Startzentren können das Ergebnis verändern, deshalb wird k-Means oft mehrmals ausgeführt.
  • Cluster entstehen allein aus den Daten; Labels sind nicht nötig.

Wann wird dieser Ansatz verwendet?

  • Verstehen, was in neuronalen Netzen und KI-Bibliotheken passiert.
  • Die Idee lernen, bevor du sie in den passenden Challenges umsetzt.
  • Dich auf Kurse zu maschinellem Lernen, Vorstellungsgespräche und Projekte vorbereiten.

Selbst ausprobieren

Mit Schritt wechselst du zwischen den beiden k-Means-Schritten, mit Start läuft es, bis sich nichts mehr ändert. Drehe rechts die Vektoren, um ihre Kosinus-Ähnlichkeit zu ändern.

Beispielcode

Code ausführen →
main.py
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}")

Erwartete Ausgabe

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]]

So funktioniert es

cosine() teilt das Skalarprodukt durch die Längen beider Vektoren, daher erhält doc2 (gleiche Richtung wie doc1) den Wert 1 und doc3 (keine gemeinsamen Wörter) den Wert 0. k-Means wiederholt zwei Schritte, ordnet jeden Punkt seinem nächsten Zentrum zu und verschiebt jedes Zentrum auf den Mittelwert seiner Punkte. Nach Schritt 2 ändert sich nichts mehr, das Verfahren ist also konvergiert.

Ändere die Werte und führe das Programm im CodeUtility Python Online-Compiler aus, ohne Python lokal zu installieren.

Übungsaufgaben

Verändere Eingaben und Randfälle, bevor du die Lösung mit größeren Datenmengen testest.

  1. Ändere Eingaben oder Gewichte und sage die Ausgabe vor dem Ausführen voraus.
  2. Gib die Zwischenwerte aus, um jeden Rechenschritt zu verfolgen.
  3. Löse die verlinkten Challenges unten, um die Idee selbst umzusetzen.
In der Python-IDE ausführen →

Mit einer Challenge üben

Nutze den Inhalt dieser Lektion, um ein echtes Problem zu lösen. Jede Challenge läuft im Browser, mit sofortigen Tests und einem KI-Review.

Alle Challenges