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 鈥嬧媏n 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 *