Programación del Algoritmo K-means en Python

Clase 28 de 29Curso de Introducción al Álgebra Lineal: Vectores

Contenido del curso

Vectores

Resumen

Pasar de la intuición geométrica a la implementación real de un algoritmo es donde ocurre el verdadero aprendizaje. Aquí se recorre paso a paso cómo funciona el algoritmo K-means programado en Python, desde las funciones fundamentales hasta un reto con datos reales de setecientas ochenta y cuatro dimensiones.

¿Cómo se asignan los puntos a cada clúster en K-means?

El primer paso del algoritmo se encapsula en la función group assignment [0:36]. Esta función recibe dos entradas: la data completa (todos los vectores) y los centroides, que son los vectores representativos de cada grupo.

El proceso interno funciona así:

  • Se recorre cada punto de la data uno por uno.
  • Para cada punto, se calcula la distancia a todos los centroides.
  • Se almacenan esas distancias en un vector del tamaño de la cantidad de centroides.
  • Se toma la distancia mínima y se asigna ese punto al centroide más cercano.

En esencia, la función le pregunta a cada vector: «¿De cuál centroide estás más cerca?» y lo etiqueta con ese grupo [1:22]. Es una comparación exhaustiva, punto por punto, contra todos los centroides disponibles.

¿Cómo se actualizan los centroides después de la asignación?

El segundo paso fundamental es la actualización de centroides [2:16]. Una vez que todos los puntos ya tienen una etiqueta de clúster, se calcula un nuevo vector representativo para cada grupo.

La función consume tres cosas: los datos, los centroides anteriores y el grouping (la salida del paso anterior). El procedimiento es directo:

  • Se recorre cada clúster.
  • Se identifican todos los vectores que pertenecen a ese clúster.
  • Se suman las entradas correspondientes de cada vector y se cuentan cuántos elementos hay con la variable count [3:48].
  • Se promedian las entradas para obtener el nuevo centroide.

Un detalle importante: no se calcula el promedio del vector completo de una sola vez, sino que se promedian coeficiente por coeficiente [4:32]. Todos los primeros coeficientes del grupo se promedian, todos los segundos se promedian, y así sucesivamente. Esto garantiza que el nuevo centroide sea verdaderamente el punto medio del grupo.

¿Qué mide el clustering objective?

La función clustering objective (representada como J) evalúa qué tan bien están agrupados los datos [5:12]. Calcula las normas de las distancias entre cada punto y su centroide asignado, las suma y obtiene el promedio. Mientras más bajo sea este valor, mejor es la agrupación.

¿Cómo se ensambla todo en una sola función?

La función principal actúa como orquestador [5:38]. Declara una variable de iteración en cero, una lista vacía para almacenar los valores de J y una variable stop en false. Entra en un ciclo while que se repite hasta que el algoritmo converge:

  • Ejecuta el paso uno (group assignment).
  • Ejecuta el paso dos (actualización de centroides).
  • Calcula el clustering objective.
  • Verifica si los nuevos centroides se movieron menos de 1×10⁻⁶ respecto a los anteriores [6:33].

Cuando el movimiento de los centroides es imperceptible, el algoritmo se detiene. La función regresa los centroides finales, los agrupamientos, el historial de valores de J y el número de iteraciones.

¿Cómo se aplica K-means a datos de alta dimensionalidad?

Con datos generados alrededor de los puntos (0,0), (1,1) y (1,-1), el algoritmo convergió en apenas cinco iteraciones [8:20]. La curva del clustering objective mostró una caída pronunciada en las primeras iteraciones y una estabilización rápida, confirmando la convergencia.

Pero el verdadero desafío viene con el dataset MNIST [9:28]. Se importa desde sklearn un conjunto de setenta mil vectores, cada uno con setecientas ochenta y cuatro dimensiones. Cada vector, al reorganizarse en una matriz de 28×28, representa un dígito escrito a mano.

¿Cuál es el reto con el dataset MNIST?

Ya no es posible visualizar los clústeres como en el plano bidimensional. Sin embargo, el algoritmo K-means opera exactamente igual sin importar la dimensión [10:22]. El reto consiste en:

  • Aplicar las funciones de K-means al conjunto MNIST.
  • Determinar la cantidad óptima de clústeres que minimice la curva de J.
  • Verificar que los vectores representativos resultantes correspondan a los dígitos del cero al nueve.

Si la clusterización funciona correctamente, cada centroide debería parecerse visualmente a uno de los diez dígitos. Comparte tus resultados y la cantidad de clústeres que mejor funcionó en los comentarios.