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.
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:
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
- 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 \)
- 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:
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
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
Ist dies auch die Reihenfolge, die du erwartet hättest?