Tous les défis
Facile 0 résolus 0 % de réussite

Similarité cosinus

Mesurez la ressemblance de deux vecteurs par l'angle qui les sépare, comme les moteurs de recherche avec les embeddings.

Ce que vous allez apprendre

  • Mesurer la similarité par l'angle
  • Calculer produits scalaires et normes
  • Comprendre comment la recherche sémantique compare des textes

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

Exemple 1
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.

Exemple 2
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.

Apprenez des autres

Solutions de la communauté

Aucune solution publiée pour l'instant. Résolvez ce défi pour partager la première.