← capítulo

Clustering con K-means

Esta vez sin etiquetas. Solo puntos en un plano.

Encuentra los grupos que ya están ahí — sin que nadie te diga qué es un grupo.

El primer capítulo no supervisado.

El algoritmo completo

Adivina k centros. Luego repite dos movimientos hasta que nada cambie:

Los centros persiguen la densidad y se estacionan en medio de cada grupo.

Los datos

150 puntos, cuatro blobs de make_blobs, sin etiquetas. En gris a propósito.

Tu ojo encuentra cuatro grupos al instante. Ahora haz que el algoritmo los encuentre.

Qué minimiza

La inercia — la suma de cuadrados dentro del cluster:

J=i=1Nxiμci2J = \sum_{i=1}^{N} \bigl\lVert x_i - \mu_{c_i} \bigr\rVert^{2}

El paso de asignación elige el centroide más cercano. El paso de actualización mueve cada centroide a la media de su cluster. Ambos solo bajan JJ, así que el bucle tiene que parar — en un mínimo local que depende del seed.

Mira moverse a los centroides

Los rombos son los centroides. Los anillos llegan al punto más lejano de cada cluster. Panel de abajo: la inercia cayendo. Cada cuadro es una iteración real.

La inercia se desploma de ~7,081 a 342 en seis iteraciones. Casi todo en el primer paso.

Elegir k: el codo

La inercia siempre baja conforme k crece. No la minimices — busca el doblez.

Acantilado hasta k=4 (342.2), luego plano. El punto naranja es el codo.

Hecho a mano vs. librería

Nuestro k-means++ contra sklearn.cluster.KMeans. Ambos llegan a inercia 342.2. Ambos sacan índice de Rand ajustado 1.0 contra los blobs reales escondidos — recuperación perfecta.

Conclusiones