Conceptos de IA en Python

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

Ejecutar código →
main.py
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.

  1. Cambia las entradas o los pesos y predice la salida antes de ejecutar.
  2. Imprime los valores intermedios para seguir cada paso del cálculo.
  3. Resuelve los retos enlazados abajo para implementar la idea por tu cuenta.
Ejecutar en el IDE de Python →

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.

Todos los retos