Problème
La similarité cosinus compare la direction de deux vecteurs et ignore leur longueur. La recherche sémantique l'utilise pour trouver des textes aux embeddings proches :
cos(a, b) = (a · b) / (|a| × |b|), où |a| = √(a₁² + a₂² + … + aₙ²)
Le résultat vaut 1 pour une même direction, 0 pour des vecteurs perpendiculaires et -1 pour des directions opposées. Si l'un des vecteurs ne contient que des zéros, renvoyez 0.
Implémentez cosine_similarity(a, b).
Entrée
a, b : deux listes de nombres de même longueur.
Sortie
Renvoyez la similarité cosinus sous forme de nombre décimal.
Contraintes
1 ≤ longueur ≤ 1 000
-1 000 ≤ chaque valeur ≤ 1 000
Exemples
Entrée :
a = [1.0, 0.0]
b = [0.0, 1.0]
Sortie attendue :
expected = 0.0
Entrée :
std::vector<double> a = {1.0, 0.0};
std::vector<double> b = {0.0, 1.0};
Sortie attendue :
double expected = 0.0;
Entrée :
double[] a = new double[] {1.0, 0.0};
double[] b = new double[] {0.0, 1.0};
Sortie attendue :
double expected = 0.0;
Explication
Le produit scalaire vaut 0, donc les vecteurs sont perpendiculaires et la similarité vaut 0.
Entrée :
a = [1.0, 2.0, 3.0]
b = [2.0, 4.0, 6.0]
Sortie attendue :
expected = 1.0
Entrée :
std::vector<double> a = {1.0, 2.0, 3.0};
std::vector<double> b = {2.0, 4.0, 6.0};
Sortie attendue :
double expected = 1.0;
Entrée :
double[] a = new double[] {1.0, 2.0, 3.0};
double[] b = new double[] {2.0, 4.0, 6.0};
Sortie attendue :
double expected = 1.0;
Explication
b vaut a multiplié par 2 : même direction, donc la similarité vaut 1 même si les longueurs diffèrent.
Références
Ce défi a été adapté pour CodeUtility. Suivez l'énoncé et les contraintes ci-dessus.