4.4.4
Similitud y distancia coseno | Comparar la dirección de vectores
- 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 #
| |
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? #
| |
Para matrices TF-IDF dispersas, cosine_similarity de scikit-learn maneja eficientemente objetos scipy.sparse.