Similitud coseno y clustering k-means en Python
El aprendizaje no supervisado encuentra estructura en datos sin etiquetas. La similitud coseno mide cuánto se parecen dos vectores, y k-means agrupa los puntos en clústeres alrededor de centros que aprende.
El concepto en palabras sencillas
El aprendizaje no supervisado encuentra estructura en datos sin etiquetas. La similitud coseno mide cuánto se parecen dos vectores, y k-means agrupa los puntos en clústeres alrededor de centros que aprende.
Mide cuánto se parecen dos vectores con la similitud coseno y agrupa datos sin etiquetas con k-means.
Ideas clave
- La similitud coseno ignora la longitud y solo compara la dirección, lo que encaja con textos y embeddings.
- k-means necesita conocer de antemano el número de clústeres k.
- Los centros iniciales pueden cambiar el resultado, por eso k-means suele ejecutarse varias veces.
- Los clústeres salen solo de los datos; no hacen falta etiquetas.
¿Cuándo se utiliza?
- Entender qué pasa dentro de las redes neuronales y las bibliotecas de IA.
- Aprender la idea antes de implementarla en los retos correspondientes.
- Prepararte para cursos de aprendizaje automático, entrevistas y proyectos.
Pruébalo en acción
Pulsa Paso para alternar los dos pasos de k-means, o Reproducir para repetirlos hasta que nada cambie. Gira los vectores de la derecha para cambiar su similitud coseno.
Código de ejemplo
import math
# Cosine similarity compares directions: 1 = same direction, 0 = unrelated.
def cosine(a, b):
dot = sum(x * y for x, y in zip(a, b))
return dot / (math.sqrt(sum(x * x for x in a)) * math.sqrt(sum(y * y for y in b)))
print("cos(doc1, doc2):", round(cosine([1, 2, 0], [2, 4, 0]), 3))
print("cos(doc1, doc3):", round(cosine([1, 2, 0], [0, 0, 3]), 3))
# k-means: assign points to the nearest centre, then move each centre to its points' mean.
points = [1, 2, 3, 10, 11, 12]
centres = [1.0, 2.0]
for step in range(1, 4):
groups = [[], []]
for p in points:
nearest = min(range(len(centres)), key=lambda i: abs(p - centres[i]))
groups[nearest].append(p)
centres = [sum(g) / len(g) for g in groups]
print(f"step {step}: centres={[round(c, 2) for c in centres]} groups={groups}")
Resultado esperado
cos(doc1, doc2): 1.0
cos(doc1, doc3): 0.0
step 1: centres=[1.0, 7.6] groups=[[1], [2, 3, 10, 11, 12]]
step 2: centres=[2.0, 11.0] groups=[[1, 2, 3], [10, 11, 12]]
step 3: centres=[2.0, 11.0] groups=[[1, 2, 3], [10, 11, 12]]
Cómo funciona
cosine() divide el producto escalar entre las longitudes de ambos vectores, por eso doc2 (misma dirección que doc1) obtiene 1 y doc3 (sin palabras en común) obtiene 0. k-means repite dos pasos, asignar cada punto a su centro más cercano y mover cada centro a la media de sus puntos. Nada cambia después del paso 2, así que ha convergido.
Cambia los valores y ejecuta el programa en el compilador Python online de CodeUtility sin instalar Python.
Ejercicios prácticos
Modifica las entradas y prueba casos límite antes de usar conjuntos de datos mayores.
- Cambia las entradas o los pesos y predice la salida antes de ejecutar.
- Imprime los valores intermedios para seguir cada paso del cálculo.
- Resuelve los retos enlazados abajo para implementar la idea por tu cuenta.
Practica con un reto
Usa lo que cubre esta lección para resolver un problema real. Cada reto se ejecuta en el navegador, con pruebas al instante y una revisión de IA.
- Similitud coseno Mide cuánto se parecen dos vectores por el ángulo entre ellos, como hacen los buscadores con los embeddings. Fácil
- Agrupamiento k-means Agrupa puntos en k clústeres asignándolos repetidamente al centroide más cercano y moviendo los centroides. Intermedio