Similitud y distancia coseno | Comparar la dirección de vectores

4.4.4

Similitud y distancia coseno | Comparar la dirección de vectores

Actualizado 2020-04-22 Lectura 3 min
Resumen
  • La similitud coseno mide la cercanía entre vectores a través del ángulo que forman.
  • Calcula similitud/distancia coseno en Python para embeddings o vectores TF-IDF dispersos.
  • Revisa aspectos prácticos como normalización y el tratamiento de vectores nulos.

1. Definición e intuición #

Para \(\mathbf{a}, \mathbf{b}\):

$$ \cos(\theta) = \frac{\mathbf{a} \cdot \mathbf{b}}{\|\mathbf{a}\| \, \|\mathbf{b}\|} $$
  • Cercano a 1: apuntan en la misma dirección (alta similitud).
  • Cerca de 0: ortogonales (sin relación).
  • Cercano a –1: direcciones opuestas.
  • Como distancia: \(d = 1 - \cos(\theta)\).

Al normalizar la magnitud, el coseno se centra en la dirección del vector.


2. Ejemplo en Python #

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity, cosine_distances

embeddings = np.array(
    [
        [0.1, 0.4, 0.5],
        [0.2, 0.2, 0.6],
        [0.6, 0.3, 0.1],
    ]
)

sim_matrix = cosine_similarity(embeddings)
dist_matrix = cosine_distances(embeddings)

print(sim_matrix.round(3))
print(dist_matrix.round(3))

Para un par de vectores usa scipy.spatial.distance.cosine. Las matrices dispersas funcionan bien con la similitud coseno en scikit-learn.


3. Características clave #

  • Invariante a la escala: ideal para TF-IDF o embeddings con magnitudes distintas.
  • Apto para datos dispersos: se mantiene estable aunque la mayoría de entradas sean cero.
  • Valores negativos: interpreta con cuidado; puede requerir centrado o normalización.

4. Aplicaciones #

  • Búsqueda y recomendación: rankear ítems según similitud coseno con una consulta o perfil.
  • Clustering temático: usar distancia coseno en k-means (o spherical k-means) para agrupar textos.
  • Evaluación de embeddings: comparar distribuciones de similitud para pares positivos/negativos.

5. Notas prácticas #

  • La similitud coseno no está definida para vectores nulos; elimínalos o añade un epsilon.
  • La distancia coseno no siempre cumple la desigualdad triangular; verifica los requisitos del algoritmo posterior.
  • Combínala con estandarización o reducción de dimensión cuando las orientaciones sean sensibles a la escala.

La similitud coseno es una métrica sencilla pero potente para comparar direcciones; cuida los vectores nulos y las asunciones métricas al integrarla en tu pipeline.


Preguntas frecuentes #

¿Qué es la similitud coseno? #

La similitud coseno mide el coseno del ángulo entre dos vectores. Su rango va de −1 a 1:

$$ \cos(\theta) = \frac{\mathbf{a} \cdot \mathbf{b}}{\|\mathbf{a}\| \, \|\mathbf{b}\|} $$

Un valor cercano a 1 indica que los vectores apuntan en la misma dirección (muy similares); cerca de 0 significa que son ortogonales (sin relación); cerca de −1 apuntan en direcciones opuestas. Al normalizar la magnitud, solo importa la dirección, no la escala.

¿Cuáles son los casos de uso de la similitud coseno? #

  • Recuperación de información: ranquear documentos por similitud a una consulta usando TF-IDF o embeddings.
  • Sistemas de recomendación: encontrar ítems o usuarios cuyos vectores de preferencia estén más alineados.
  • Búsqueda semántica en NLP: comparar embeddings de frases de modelos como BERT o sentence-transformers.
  • Clustering de texto: usar distancia coseno en k-means esférico para agrupar documentos por tema.
  • Detección de duplicados: identificar documentos o productos casi idénticos.
  • Detección de anomalías: marcar ítems cuya dirección vectorial se desvíe notablemente de la norma.

¿Cuándo usar similitud coseno en lugar de distancia euclidiana? #

La distancia euclidiana mide la separación espacial absoluta; la similitud coseno mide la separación angular (ignora la magnitud). Usa similitud coseno cuando:

  • Los vectores tienen magnitudes muy distintas (documentos de distinta longitud, conteos de palabras).
  • Solo importa la dirección o el tema, no la intensidad.
  • Trabajas con vectores dispersos de alta dimensión (TF-IDF, one-hot).

Usa distancia euclidiana cuando la magnitud importa (señales físicas, coordenadas geográficas).

¿Cómo calcular la similitud coseno en Python? #

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import numpy as np
from sklearn.metrics.pairwise import cosine_similarity

A = np.array([[1, 2, 3], [4, 5, 6]])
sim = cosine_similarity(A)
print(sim)

# Par individual
from scipy.spatial.distance import cosine
distancia = cosine([1, 2, 3], [4, 5, 6])   # distancia coseno = 1 − similitud
print(1 - distancia)                         # similitud coseno

Para matrices TF-IDF dispersas, cosine_similarity de scikit-learn maneja eficientemente objetos scipy.sparse.