Programación del Algoritmo K-means en Python

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

Resumen

¿Cómo se implementa el algoritmo K-means en Python?

Si te interesa el clustering en la ciencia de datos, entender e implementar el algoritmo K-means es vital. Esta técnica no supervisada de machine learning ayuda a agrupar nuestros datos en base a características compartidas. A continuación, verás cómo implementar K-means en Python gracias a un ejemplo práctico, paso a paso.

¿Cómo se asignan los puntos a los clústeres?

El primer paso en K-means es la asignación de cada punto de datos al clúster más cercano:

def group_assignment(data, centroids):
    assignments = []
    for point in data:
        distances = [np.linalg.norm(point - centroid) for centroid in centroids]
        assignments.append(np.argmin(distances))
    return assignments
  • Entrada: Lista de puntos de datos y centroides iniciales.
  • Salida: Cada punto del dataset es asignado al clúster correspondiente.

¿Cómo se actualizan los centroides?

Luego, se ajustan los centroides según el promedio de los puntos asignados a cada clúster:

def update_centroids(data, assignments, num_centroids):
    new_centroids = []
    for i in range(num_centroids):
        assigned_points = [data[j] for j in range(len(data)) if assignments[j] == i]
        new_centroids.append(np.mean(assigned_points, axis=0))
    return new_centroids
  • Entrada: Datos originales, clusterización actual y número de centroides.
  • Proceso: Calcula el promedio de puntos asignados a cada clúster para encontrar nuevos centroides.

¿Cómo se mide el desempeño del clúster?

La función objetivo del algoritmo mide cuán bien ajustados están los clústeres:

def clustering_objective(data, assignments, centroids):
    total_distance = 0
    for i, point in enumerate(data):
        centroid_index = assignments[i]
        total_distance += np.linalg.norm(point - centroids[centroid_index])**2
    return total_distance

Aquí se suman las distancias entre cada punto y su centroide asignado, permitiendo evaluar la calidad de la clusterización.

¿Cómo se ejecuta el algoritmo completo?

El ciclo de ejecución del algoritmo hasta la convergencia involucra la reasignación de puntos y la actualización de centroides:

def kmeans(data, num_centroids, tol=1e-6, max_iterations=300):
    centroids = data[np.random.choice(len(data), num_centroids, replace=False)]
    for i in range(max_iterations):
        assignments = group_assignment(data, centroids)
        new_centroids = update_centroids(data, assignments, num_centroids)
        if np.all(np.abs(new_centroids - centroids) < tol):
            break
        centroids = new_centroids
    return centroids, assignments
  • Iteraciones: Se controla por un límite de iteraciones o una tolerancia mínima de movimiento de los centroides.
  • Objetivo: Converger a un estado estable donde los centroides ya no se mueven significativamente.

Estos pasos junto a la capacidad de analizar la evolución del objetivo de clusterización te ayudarán a mejorar tu modelo.

¿Cuál es el reto del usuario?

El desafío final es aplicar estos conocimientos para identificar y clusterizar un conjunto complejo de datos. Utiliza el dataset MINST de números escritos a mano para organizar sus vectores. Si ejecutas correctamente el algoritmo, tus centroides coincidirán con los números del 0 al 9.

Te alentamos a que pruebes este reto, el cual consolidará tu comprensión del algoritmo K-means y mejorará tus habilidades en machine learning. ¡Esperamos tus resultados!