Todos os desafios
Fácil 0 resolvidos 0% de aceitação

Similaridade de cosseno

Meça o quanto dois vetores são parecidos pelo ângulo entre eles, como os buscadores fazem com embeddings.

O que você vai aprender

  • Medir a similaridade pelo ângulo
  • Calcular produtos escalares e normas
  • Entender como a busca semântica compara textos

Problema

Ver original (inglês)

A similaridade de cosseno compara a direção de dois vetores e ignora o tamanho deles. A busca semântica a usa para encontrar textos com embeddings parecidos:

cos(a, b) = (a · b) / (|a| × |b|), onde |a| = √(a₁² + a₂² + … + aₙ²)

O resultado é 1 para a mesma direção, 0 para vetores perpendiculares e -1 para direções opostas. Se algum dos vetores for todo de zeros, retorne 0.

Implemente cosine_similarity(a, b).

Entrada

a, b: Duas listas de números com o mesmo tamanho.

Saída

Retorne a similaridade de cosseno como número decimal.

Restrições

1 ≤ tamanho ≤ 1.000

-1.000 ≤ cada valor ≤ 1.000

Exemplos

Exemplo 1
Entrada:
a = [1.0, 0.0]
b = [0.0, 1.0]

Saída esperada:
expected = 0.0
Entrada:
std::vector<double> a = {1.0, 0.0};
std::vector<double> b = {0.0, 1.0};

Saída esperada:
double expected = 0.0;
Entrada:
double[] a = new double[] {1.0, 0.0};
double[] b = new double[] {0.0, 1.0};

Saída esperada:
double expected = 0.0;

Explicação

O produto escalar é 0, então os vetores são perpendiculares e a similaridade é 0.

Exemplo 2
Entrada:
a = [1.0, 2.0, 3.0]
b = [2.0, 4.0, 6.0]

Saída esperada:
expected = 1.0
Entrada:
std::vector<double> a = {1.0, 2.0, 3.0};
std::vector<double> b = {2.0, 4.0, 6.0};

Saída esperada:
double expected = 1.0;
Entrada:
double[] a = new double[] {1.0, 2.0, 3.0};
double[] b = new double[] {2.0, 4.0, 6.0};

Saída esperada:
double expected = 1.0;

Explicação

b é a vezes 2: mesma direção, então a similaridade é 1 mesmo com tamanhos diferentes.

Referências

Este desafio foi adaptado para o CodeUtility. Siga o enunciado e as restrições acima.

Aprenda com outros

Soluções da comunidade

Ainda não há soluções publicadas. Resolva este desafio para compartilhar a primeira.