Tutte le sfide
Facile 0 risolte 0% di accettazione

Similarità del coseno

Misura quanto sono simili due vettori in base all'angolo tra loro, come fanno i motori di ricerca con gli embedding.

Cosa imparerai

  • Misurare la similarità tramite l'angolo
  • Calcolare prodotti scalari e norme
  • Capire come la ricerca semantica confronta i testi

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

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

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

Impara dagli altri

Soluzioni della community

Nessuna soluzione pubblicata. Risolvi questa sfida per condividere la prima.