Agrupación de K-medias con Scikit-Learn

    Introducción

    La agrupación en clústeres de K-means es uno de los algoritmos de Machine Learning sin supervisión más utilizados que forma grupos de datos en función de la similitud entre instancias de datos. Para que este algoritmo en particular funcione, el número de clústeres debe definirse de antemano. La K en las K-medias se refiere al número de conglomerados.

    El algoritmo de K-medias comienza eligiendo al azar un valor de centroide para cada grupo. Después de eso, el algoritmo realiza iterativamente tres pasos: (i) Encuentre la distancia euclidiana entre cada instancia de datos y los centroides de todos los grupos; (ii) Asignar las instancias de datos al grupo del centroide con la distancia más cercana; (iii) Calcule nuevos valores de centroide basados ​​en los valores medios de las coordenadas de todas las instancias de datos del grupo correspondiente.

    Un ejemplo simple

    Intentemos ver cómo funciona el algoritmo K-means con la ayuda de un ejemplo hecho a mano, antes de implementar el algoritmo en Scikit-Learn. Se necesitan tres líneas de código para implementar el Algoritmo de agrupación de K-means en Scikit-Learn. Sin embargo, para entender cómo funciona realmente, primero resolvamos un problema de agrupamiento utilizando agrupaciones de K-medias “en papel”.

    Supongamos que tenemos un conjunto de las siguientes instancias de datos bidimensionales llamadas D.

    D = { (5,3), (10,15), (15,12), (24,10), (30,45), (85,70), (71,80), (60,78), (55,52), (80,91) }
    

    Queremos dividir estos datos en dos grupos, C1 y C2 en función de la similitud entre los puntos de datos.

    El primer paso es inicializar aleatoriamente los valores de los centroides de ambos grupos. Nombremos los centroides de los clústeres C1 y C2 como c1 y c2 e inicializarlos con los valores de los dos primeros puntos de datos, es decir (5, 3) y (10, 15).

    Ahora tenemos que comenzar las iteraciones.

    Iteración 1

    S. Sin puntos de datos Distancia euclidiana desde el centroide del grupo c1 = (5,3) Distancia euclidiana desde el centroide del grupo c2 = (10,15) Grupo asignado

    1(5,3)013C1
    2(10,15)130C2
    3(15,12)13.455.83C2
    4(24,10)20.2414,86C2
    5(30,45)48,8736C2
    6(85,70)104,3593C2
    7(71,80)101,4189C2
    8(60,78)9380C2
    9(55,52)7058C2
    10(80,91)115,52103,32C2

    En la tabla anterior, la segunda columna contiene todos los puntos de datos. La tercera columna contiene el distancia euclidiana entre todos los puntos de datos y el centroide c1. De manera similar, la cuarta columna contiene la distancia entre c2 centroide y los puntos de datos. Finalmente, en la quinta columna mostramos a qué grupo se asigna el punto de datos en función de la distancia euclidiana entre los dos centroides del grupo. Por ejemplo, observe el tercer punto de datos (15, 12). Tiene una distancia de 13,45 unidades de c1 mientras que una distancia de 5,83 unidades de c2; por lo tanto, se ha agrupado en C2.

    Después de asignar puntos de datos a los grupos correspondientes, el siguiente paso es calcular los nuevos valores de centroide. Estos valores se calculan encontrando las medias de las coordenadas de los puntos de datos que pertenecen a un grupo en particular.

    Para el grupo C1, actualmente solo hay un punto, es decir, (5,3), por lo tanto, la media de las coordenadas sigue siendo la misma y el nuevo valor del centroide c1 también será (5,3).

    Para C2, actualmente hay 9 puntos de datos. Nombramos las coordenadas de los puntos de datos como x y y. El nuevo valor para x coordenada del centroide c2 se puede calcular determinando la media de x coordenadas de los 9 puntos que pertenecen al grupo C2 como se indica a continuación:

    c2(x) = (10 + 15 + 24 + 30 + 85 + 71 + 60 + 55 + 80) / 9 = 47.77
    

    El nuevo valor para y coordenada del centroide c2 se puede calcular determinando la media de todos y coordenadas de los 9 puntos que pertenecen al grupo C2.

    c2(y) = (15 + 12 + 10 + 45 + 70 + 80 + 78 + 52 + 91) / 9 = 50.33
    

    El valor de centroide actualizado para c2 ahora será {47.77, 50.33}.

    Para la siguiente iteración, los nuevos valores de centroide para c1 y c2 se utilizará y se repetirá todo el proceso. Las iteraciones continúan hasta que los valores del centroide dejan de actualizarse. Las siguientes iteraciones son las siguientes:

    Iteración 2

    S. Sin puntos de datos Distancia euclidiana desde el centroide del grupo c1 = (5,3) Distancia euclidiana desde el centroide del grupo c2 = (47.77,50.33) Grupo asignado

    1(5,3)063,79C1
    2(10,15)1351,71C1
    3(15,12)13.4550,42C1
    4(24,10)20.2446,81C1
    5(30,45)48,8718.55C2
    6(85,70)104,3542,10C2
    7(71,80)101,4137,68C2
    8(60,78)9330.25C2
    9(55,52)707,42C2
    10(80,91)115,5251,89C2
    c1(x) = (5, 10, 15, 24) / 4 = 13.5
    c1(y) = (3, 15, 12, 10) / 4 = 10.0
    

    Actualizado c1 ser (13,5, 10,0).

    c2(x) = (30 + 85 + 71 + 60 + 55 + 80) / 6 = 63.5
    c2(y) = (45 + 70 + 80 + 78 + 52 +91) / 6 = 69.33
    

    Actualizado c2 ser (63,5, 69,33).

    Iteración 3

    S. Sin puntos de datos Distancia euclidiana desde el centroide del grupo c1 = (13.5,10) Distancia euclidiana desde el centroide del grupo c2 = (63.5,69.33) Grupo asignado

    1(5,3)11.0188,44C1
    2(10,15)6,1076,24C1
    3(15,12)2.575.09C1
    4(24,10)10,571,27C1
    5(30,45)38,6941,40C1
    6(85,70)93,3321.51C2
    7(71,80)90,5813.04C2
    8(60,78)82,379.34C2
    9(55,52)59.0419.30C2
    10(80,91)104.8027.23C2
    c1(x) = (5, 10, 15, 24, 30) / 5 = 16.8
    c1(y) = (3, 15, 12, 10, 45) / 5 = 17.0
    

    Actualizado c1 ser (16.8, 17.0).

    c2(x) = (85 + 71 + 60 + 55 + 80) / 5 = 70.2
    c2(y) = (70 + 80 + 78 + 52 + 91) / 5 = 74.2
    

    Actualizado c2 ser (70,2, 74,2).

    Iteración 4

    S. Sin puntos de datos Distancia euclidiana desde el centroide del grupo c1 = (16.8,17) Distancia euclidiana desde el centroide del grupo c2 = (70.2,74.2) Grupo asignado

    1(5,3)18.3096,54C1
    2(10,15)7.0884,43C1
    3(15,12)5.3183,16C1
    4(24,10)10.0479.09C1
    5(30,45)30,9549,68C1
    6(85,70)86,3715.38C2
    7(71,80)83,105,85C2
    8(60,78)74,7410,88C2
    9(55,52)51,8026,90C2
    10(80,91)97,3119.44C2
    c1(x) = (5, 10, 15, 24, 30) / 5 = 16.8
    c1(y) = (3, 15, 12, 10, 45) / 5 = 17.0
    

    Actualizado c1 ser (16.8, 17.0).

    c2(x) = (85 + 71 + 60 + 55 + 80) / 5 = 70.2
    c2(y) = (70 + 80 + 78 + 52 + 91) / 5 = 74.2
    

    Actualizado c2 ser (70,2, 74,2).

    Al final de la cuarta iteración, los valores actualizados de C1 y C2 son los mismos que estaban al final de la tercera iteración. Esto significa que los datos ya no se pueden agrupar. c1 y c2 son los centroides de C1 y C2. Para clasificar un nuevo punto de datos, se calcula la distancia entre el punto de datos y los centroides de los grupos. El punto de datos se asigna al clúster cuyo centroide está más cerca del punto de datos.

    Agrupación de K-means con Scikit-Learn

    Ahora que sabemos cómo funciona realmente el algoritmo de agrupación en clústeres de K-medias, veamos cómo podemos implementarlo con Scikit-Learn.

    Para ejecutar el siguiente script, necesita las bibliotecas matplotlib, numpy y scikit-learn. Consulte los siguientes enlaces para obtener instrucciones sobre cómo descargar e instalar estas bibliotecas.

    Importar bibliotecas

    Comencemos nuestro script importando primero las bibliotecas requeridas:

    import matplotlib.pyplot as plt
    %matplotlib inline
    import numpy as np
    from sklearn.cluster import KMeans
    

    Preparar datos

    El siguiente paso es preparar los datos que queremos agrupar. Vamos a crear un numpy matriz de 10 filas y 2 columnas. La fila contiene los mismos puntos de datos que usamos para nuestro ejemplo manual de agrupamiento de K-medias en la última sección. Creamos un numpy matriz de puntos de datos porque la biblioteca Scikit-Learn puede trabajar con numpy entradas de datos de tipo array sin necesidad de preprocesamiento.

    X = np.array([[5,3],
         [10,15],
         [15,12],
         [24,10],
         [30,45],
         [85,70],
         [71,80],
         [60,78],
         [55,52],
         [80,91],])
    

    Visualiza los datos

    Puede ver que estos son los mismos puntos de datos que usamos en el ejemplo anterior. Tracemos estos puntos y verifiquemos si podemos observar algún grupo. Para hacerlo, ejecute la siguiente línea:

    plt.scatter(X[:,0],X[:,1], label="True Position")
    

    El código anterior simplemente traza todos los valores en la primera columna de la matriz X contra todos los valores en la segunda columna. El gráfico se verá así:

    A simple vista, si tenemos que formar dos grupos de los puntos de datos anteriores, probablemente crearemos un grupo de cinco puntos en la parte inferior izquierda y un grupo de cinco puntos en la parte superior derecha. Veamos si nuestro algoritmo de agrupación de K-medias hace lo mismo o no.

    Crear clústeres

    Para crear un clúster de K-means con dos clústeres, simplemente escriba el siguiente script:

    kmeans = KMeans(n_clusters=2)
    kmeans.fit(X)
    

    Sí, son solo dos líneas de código. En la primera línea, crea un KMeans objeto y páselo 2 como valor para n_clusters parámetro. A continuación, simplemente tiene que llamar al fit método en kmeans y pasar los datos que desea agrupar, que en este caso es el X matriz que creamos anteriormente.

    Ahora veamos qué centroide valora el algoritmo generado para los grupos finales. Tipo:

    print(kmeans.cluster_centers_)
    

    La salida será una matriz bidimensional de forma 2 x 2.

    [[ 16.8  17. ]
     [ 70.2  74.2]]
    

    Aquí la primera fila contiene valores para las coordenadas del primer centroide, es decir, (16.8, 17) y la segunda fila contiene valores para las coordenadas del otro centroide, es decir (70.2, 74.2). Puede ver que estos valores son similares a los que calculamos manualmente para los centroides. c1 y c2 en la última sección. En resumen, nuestro algoritmo funciona bien.

    Para ver las etiquetas del punto de datos, ejecute el siguiente script.

    print(kmeans.labels_)
    

    La salida es una matriz unidimensional de 10 elementos correspondientes a los grupos asignados a nuestros 10 puntos de datos.

    [0 0 0 0 0 1 1 1 1 1]
    

    Aquí, los primeros cinco puntos se han agrupado y los últimos cinco puntos se han agrupado. Aquí, 0 y 1 se utilizan simplemente para representar ID de conglomerados y no tienen significado matemático. Si hubiera tres grupos, el tercer grupo habría estado representado por dígitos 2.

    Tracemos los puntos de datos nuevamente en el gráfico y visualicemos cómo se han agrupado los datos. Esta vez trazaremos los datos junto con su etiqueta asignada para que podamos distinguir entre los grupos. Ejecute el siguiente script:

    plt.scatter(X[:,0],X[:,1], c=kmeans.labels_, cmap='rainbow')
    

    Aquí estamos trazando la primera columna del X matriz contra la segunda columna, sin embargo, en este caso también estamos pasando kmeans.labels_ como valor para el c parámetro que corresponde a las etiquetas. los cmap='rainbow' se pasa el parámetro para elegir el tipo de color para los diferentes puntos de datos. El gráfico de salida debería verse así:

    Como se esperaba, los primeros cinco puntos en la parte inferior izquierda se han agrupado (mostrados en azul), mientras que los puntos restantes en la parte superior derecha se han agrupado (mostrados en rojo).

    Ahora ejecutemos el algoritmo K-means con tres grupos y veamos el gráfico de salida.

    Puede ver que nuevamente los puntos que están cerca unos de otros se han agrupado.

    Ahora tracemos los puntos junto con las coordenadas del centroide de cada grupo para ver cómo las posiciones del centroide afectan el agrupamiento. Nuevamente usaremos tres grupos para ver el efecto de los centroides. Ejecute el siguiente script para dibujar el gráfico:

    plt.scatter(X[:,0], X[:,1], c=kmeans.labels_, cmap='rainbow')
    plt.scatter(kmeans.cluster_centers_[:,0] ,kmeans.cluster_centers_[:,1], color="black")
    

    Aquí, en este caso, estamos trazando los puntos de datos en colores del arco iris mientras que los centroides están en negro. La salida se ve así:

    En el caso de tres grupos, los dos puntos del medio (mostrados en rojo) tienen una distancia más cercana al centroide del medio (mostrado en negro entre los dos rojos), en comparación con los centroides de la parte inferior izquierda o superior derecha. Sin embargo, si hubiera dos grupos, no habría habido un centroide en el centro, por lo que los puntos rojos tendrían que agruparse junto con los puntos en los grupos de la parte inferior izquierda o superior derecha.

    Conclusión

    La agrupación en clústeres de K-means es un algoritmo de Machine Learning no supervisado simple pero muy eficaz para la agrupación de datos. Agrupa los datos en función de la distancia euclidiana entre puntos de datos. El algoritmo de agrupación de K-means tiene muchos usos para agrupar documentos de texto, imágenes, videos y mucho más.

    ¿Alguna vez ha utilizado la agrupación en clústeres de K-means en una aplicación? Si es así, ¿para qué? ¡Háznoslo saber en los comentarios!

     

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *