Problema
La similarità del coseno confronta la direzione di due vettori e ignora la loro lunghezza. La ricerca semantica la usa per trovare testi con embedding simili:
cos(a, b) = (a · b) / (|a| × |b|), dove |a| = √(a₁² + a₂² + … + aₙ²)
Il risultato è 1 per la stessa direzione, 0 per vettori perpendicolari e -1 per direzioni opposte. Se uno dei due vettori è tutto zeri, restituisci 0.
Implementa cosine_similarity(a, b).
Input
a, b: Due liste di numeri della stessa lunghezza.
Output
Restituisci la similarità del coseno come numero decimale.
Vincoli
1 ≤ lunghezza ≤ 1.000
-1.000 ≤ ogni valore ≤ 1.000
Esempi
Input:
a = [1.0, 0.0]
b = [0.0, 1.0]
Output atteso:
expected = 0.0
Input:
std::vector<double> a = {1.0, 0.0};
std::vector<double> b = {0.0, 1.0};
Output atteso:
double expected = 0.0;
Input:
double[] a = new double[] {1.0, 0.0};
double[] b = new double[] {0.0, 1.0};
Output atteso:
double expected = 0.0;
Spiegazione
Il prodotto scalare è 0, quindi i vettori sono perpendicolari e la similarità è 0.
Input:
a = [1.0, 2.0, 3.0]
b = [2.0, 4.0, 6.0]
Output atteso:
expected = 1.0
Input:
std::vector<double> a = {1.0, 2.0, 3.0};
std::vector<double> b = {2.0, 4.0, 6.0};
Output atteso:
double expected = 1.0;
Input:
double[] a = new double[] {1.0, 2.0, 3.0};
double[] b = new double[] {2.0, 4.0, 6.0};
Output atteso:
double expected = 1.0;
Spiegazione
b è a per 2: stessa direzione, quindi la similarità è 1 anche se le lunghezze sono diverse.
Riferimenti
Questa sfida è adattata per CodeUtility. Segui la traccia e i vincoli sopra.