Kosinus-Ähnlichkeit

Die Kosinus-Ähnlichkeit misst den Winkel zwischen zwei Vektoren im n-dimensionalen Raum und gibt an, wie ähnlich sie sich in ihrer Richtung sind: Ein Wert von 1 bedeutet maximale Ähnlichkeit und ein Wert von -1 maximale Unähnlichkeit. Sie wird in der Textanalyse, im maschinellen Lernen und in Empfehlungssystemen eingesetzt, um die Ähnlichkeit zwischen Datenpunkten wie Dokumenten, Nutzern oder Produkten zu quantifizieren.

Kosinus-Ähnlichkeit 2D-Skizze mit zwei Vektoren
Kosinus-Ähnlichkeit 2D-Skizze mit zwei Vektoren

Was ist die Kosinus-Ähnlichkeit?

Die Kosinus-Ähnlichkeit misst den Winkel zwischen zwei Vektoren im n-dimensionalen Raum. Sie berechnet den Kosinus des Winkels zwischen ihnen. Der Kosinus-Wert reicht von -1 bis 1:

  • Ein Wert von 1 bedeutet, dass die Vektoren exakt in die gleiche Richtung zeigen.
  • Ein Wert von 0 bedeutet, dass die Vektoren orthogonal (rechtwinklig) zueinander sind und somit keine Ähnlichkeit aufweisen.
  • Ein Wert von -1 bedeutet, dass die Vektoren exakt in die entgegengesetzte Richtung zeigen.

Mathematische Darstellung

Die Kosinus-Ähnlichkeit zwischen zwei Vektoren A und B wird durch die folgende Formel berechnet:

Kosinus-Ähnlichkeit = \( \cos(\theta) = \frac{\mathbf{A} \cdot \mathbf{B}}{ ||\mathbf{A}|| \, ||\mathbf{B}||} \)

mit:

  • \( \textbf{A} \cdot \textbf{B} \) ist das Skalarprodukt (oder Punktprodukt) der Vektoren A und B.
  • ||A|| und ||B|| sind die Euklidischen Normen (oder Längen) der Vektoren A und B.

Erinnerung

  1. Skalarprodukt berechnen: Das Skalarprodukt zweier Vektoren A und B ist die Summe der Produkte ihrer entsprechenden Komponenten. Für \( \textbf{A} = \left[ A_1, A_2, …, A_n\right] \) und \( \textbf{B} = \left[ B_1, B_2, …, B_n\right] \) gilt dementsprechend für das Skalarprodukt:
    \( \textbf{A} \cdot \textbf{B} = A_1 \cdot B_1 + A_2 \cdot B_2 + … + A_n \cdot B_n \)
  1. Euklidische Norm berechnen: Die Euklidische Norm eines Vektors A ist:
    \( ||\mathbf{A}|| = \sqrt{A_1^2 + A_2^2 + … + A_n^2} \)

Beispiel

Als Beispiel nehme ich die drei folgenden Sätze als Korpus:

„Ich liebe Pizza.“ (Vektor 0),
„Heute mache ich mir eine Pizza.“ (Vektor 1),
„Gestern habe ich Pasta gegessen.“ (Vektor 2),
Dementsprechend ergibt sich für die drei Vektoren mittels TF-IDF:

Python Output TF-IDF Cosinus-Similarity Example
(siehe unten in der Python Implementierung für die Herleitung)

Für die Kosinus-Ähnlichkeit zwischen Vektor 0 und Vektor 1 ergibt sich somit:

\( \cos(\theta_{01}) = \frac{\mathbf{v_0} \cdot \mathbf{v_1}}{ ||\mathbf{v_0}|| \, ||\mathbf{v_1}||} \approx \frac{0.301}{1} \approx 0.301 \)
mit

\( \mathbf{v_0} \cdot \mathbf{v_1} = 0\cdot 0.451 + 0 \cdot 0 + 0 \cdot 0 + 0 \cdot 0 + 0\cdot 0.451 + 0.425\cdot 0.266 + 0.720 \cdot 0 + \\ 0 \cdot 0.451 + 0 \cdot 0.451 + 0 \cdot 0 + 0.548 \cdot 0.343 \approx 0.301 \)

\(||\mathbf{v_0}|| = ||\mathbf{v_1}|| = 1\)
(Die von Scikit-learn erzeugten TF-IDF Vektoren sind schon normiert.)

Dieselbe Vorgehensweise kann nun auf alle anderen Vektorkombinationen durchgeführt werden, um die Kosinus-Ähnlichkeit zu bestimmen.

Anwendungsbereiche

Die Kosinus-Ähnlichkeit wird häufig in der Textanalyse, im maschinellen Lernen und in der Informationsretrieval verwendet. Einige typische Anwendungsfälle sind:

  • Dokumentenähnlichkeit: Bestimmen, wie ähnlich zwei Dokumente basierend auf ihrem Wortinhalt sind.
  • Empfehlungssysteme: Finden von ähnlichen Nutzern oder Produkten basierend auf Präferenzvektoren.
  • Klassifikation: Messen der Ähnlichkeit von Eingabedaten zu verschiedenen Klassen.

Zusammenfassung

Die Kosinus-Ähnlichkeit ist ein leistungsfähiges Werkzeug zur Messung der Ähnlichkeit zwischen Vektoren, insbesondere in hohen Dimensionen. Ihre Einfachheit und Effektivität machen sie zu einer bevorzugten Wahl in vielen Anwendungen der Datenanalyse und des maschinellen Lernens. Durch das Verstehen und Anwenden der Kosinus-Ähnlichkeit kann die Beziehungen zwischen komplexen Datensätzen auf intuitive Weise quantifiziert werden.

Implementierung in Python

Das Python package scikit-learn liefert schon eine Implementierung der Kosinus-Ähnlichkeits-Metrik mit. Zunächst werden TF-IDF Vektoren erzeugt, dazu nutze ich ein sehr ähnliches Beispiel wie im Artikel TF-IDF:

# Importiere Pakete
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer

# Text Korpus
corpus = [
„Ich liebe Pizza.“,
„Heute mache ich mir eine Pizza.“,
„Gestern habe ich Pasta gegessen.“
]

# Initialisiere TF-IDF Vectorizer
tfidf_vectorizer = TfidfVectorizer()

# Berechne TF-IDF Vektor
tfidf_vector = tfidf_vectorizer.fit_transform(corpus)

# Speichere den Vektor als pandas dataframe
df_tfidf = pd.DataFrame(tfidf_vector.toarray(), columns=tfidf_vectorizer.get_feature_names_out())

# Zeige dataframe
df_tfidf

Python Output TF-IDF Cosinus-Similarity Example
Python Output df_tfidf: Welche Sätze sind aus eurer Sicht ähnlicher und sollten dementsprechend eine höhere Kosinus-Ähnlichkeit ausweisen?

Anschließend wird die Ähnlichkeit der Vektoren des kompletten Korpus (die drei Vektoren aller drei Sätze) mit dem des ersten Satzes (Vektor 0) berechnet:

# Lade Pakete
from sklearn.metrics.pairwise import cosine_similarity

# Transformiere den ersten Satz in den Typen: array-like, sparse matrix
vec0 = [df_tfidf.to_numpy()[0]]
# Transformiere den Korpus in den Typen: array-like, sparse matrix
list_tfidf_corpus = df_tfidf.to_numpy().tolist()

# Berechne die Kosinus-Ähnlichkeit zwischen dem ersten Satz Vec0 und dem ganzen Korpus list_tfidf_corpus
cos_sim = cosine_similarity(vec0, list_tfidf_corpus)
cos_sim

Python Output TF-IDF Cosinus-Similarity Result
Der Python Output zeigt, dass der erste Satz des Korpus vollkommen mit dem ausgewählten ersten Satz vec0 übereinstimmt (sie sind ja auch identisch). Der zweite Satz hat einen Kosinus-Ähnlichkeits-Wert von ~0.30 und der dritte Satz ~0.12.
Ist dies auch die Reihenfolge, die du erwartet hättest?
Nach oben scrollen