Problem
Die Kosinus-Ähnlichkeit vergleicht die Richtung zweier Vektoren und ignoriert ihre Länge. Die semantische Suche nutzt sie, um Texte mit ähnlichen Embeddings zu finden:
cos(a, b) = (a · b) / (|a| × |b|), wobei |a| = √(a₁² + a₂² + … + aₙ²)
Das Ergebnis ist 1 bei gleicher Richtung, 0 bei senkrechten Vektoren und -1 bei entgegengesetzter Richtung. Besteht einer der Vektoren nur aus Nullen, gib 0 zurück.
Implementiere cosine_similarity(a, b).
Eingabe
a, b: Zwei Zahlenlisten gleicher Länge.
Ausgabe
Gib die Kosinus-Ähnlichkeit als Dezimalzahl zurück.
Einschränkungen
1 ≤ Länge ≤ 1.000
-1.000 ≤ jeder Wert ≤ 1.000
Beispiele
Eingabe:
a = [1.0, 0.0]
b = [0.0, 1.0]
Erwartete Ausgabe:
expected = 0.0
Eingabe:
std::vector<double> a = {1.0, 0.0};
std::vector<double> b = {0.0, 1.0};
Erwartete Ausgabe:
double expected = 0.0;
Eingabe:
double[] a = new double[] {1.0, 0.0};
double[] b = new double[] {0.0, 1.0};
Erwartete Ausgabe:
double expected = 0.0;
Erläuterung
Das Skalarprodukt ist 0, also stehen die Vektoren senkrecht aufeinander und die Ähnlichkeit ist 0.
Eingabe:
a = [1.0, 2.0, 3.0]
b = [2.0, 4.0, 6.0]
Erwartete Ausgabe:
expected = 1.0
Eingabe:
std::vector<double> a = {1.0, 2.0, 3.0};
std::vector<double> b = {2.0, 4.0, 6.0};
Erwartete Ausgabe:
double expected = 1.0;
Eingabe:
double[] a = new double[] {1.0, 2.0, 3.0};
double[] b = new double[] {2.0, 4.0, 6.0};
Erwartete Ausgabe:
double expected = 1.0;
Erläuterung
b ist a mal 2: gleiche Richtung, also ist die Ähnlichkeit 1, obwohl die Längen verschieden sind.
Referenzen
Diese Aufgabe wurde für CodeUtility angepasst. Beachte die oben genannten Vorgaben und Einschränkungen.