K-Means en Python

K-means es un método de aprendizaje no supervisado para agrupar puntos de datos. El algoritmo divide iterativamente los puntos de datos en K grupos minimizando la varianza en cada grupo.

Aquí, le mostraremos como estimar el mejor valor para K usando el método del codo, luego usaremos el agrupamiento de K-medias para agrupar los puntos de datos en grupos.

¿Como funciona?

Primero, cada punto de datos se asigna aleatoriamente a uno de los K grupos. Luego, calculamos el centroide (funcionalmente el centro) de cada grupo y reasignamos cada punto de datos al grupo con el centroide más cercano. Repetimos este proceso hasta que las asignaciones de grupos para cada punto de datos ya no cambien.

El agrupamiento de K-means requiere que seleccionemos K, el número de grupos en los que queremos agrupar los datos. El método del codo nos permite graficar la inercia (una métrica basada en la distancia) y visualizar el punto en el que comienza a disminuir linealmente. Este punto se denomina «elow» y es una buena estimación del mejor valor de K según nuestros datos.

Ejemplo

Comience visualizando algunos puntos de datos:

import matplotlib.pyplot as plt

x = [4, 5, 10, 4, 3, 11, 14 , 6, 10, 12]
y = [21, 19, 24, 17, 16, 25, 24, 22, 21, 21]

plt.scatter(x, y)
plt.show()

Ahora utilizamos el método del codo para visualizar la inercia para diferentes valores de K:

Ejemplo

from sklearn.cluster import KMeans

data = list(zip(x, y))
inertias = []

for i in range(1,11):
    kmeans = KMeans(n_clusters=i)
    kmeans.fit(data)
    inertias.append(kmeans.inertia_)

plt.plot(range(1,11), inertias, marker='o')
plt.title('Elbow method')
plt.xlabel('Number of clusters')
plt.ylabel('Inertia')
plt.show()

El método del codo muestra que 2 es un buen valor para K, por lo que volvemos a entrenar y visualizamos el resultado:

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

plt.scatter(x, y, c=kmeans.labels_)
plt.mostrar()

Ejemplo Explicado

Importa los módulos que necesites.

import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

scikit-learn es una biblioteca popular para el aprendizaje automático.

Cree matrices que se parezcan a dos variables en un conjunto de datos. Tenga en cuenta que si bien solo usamos dos variables aquí, este método funcionará con cualquier cantidad de variables:

x = [4, 5, 10, 4, 3, 11, 14 , 6, 10, 12]
y = [21, 19, 24, 17, 16, 25, 24, 22, 21, 21]

Convierta los datos en un conjunto de puntos:

data = list(zip(x, y))
print(data)

Resultado:

[(4,21), (5,19), (10,24), (4,17), (3,16), (11,25), (14,24), (6,22), (10,21), (12,21)]

Para encontrar el mejor valor para K, necesitamos ejecutar K-means en nuestros datos para un rango de valores posibles. Solo tenemos 10 puntos de datos, por lo que la cantidad máxima de grupos es 10. Entonces, para cada valor K en el rango (1,11), entrenamos un modelo de K-medias y trazamos la inercia en esa cantidad de grupos:

inertias = []

for i in range(1,11):
    kmeans = KMeans(n_clusters=i)
    kmeans.fit(data)
    inertias.append(kmeans.inertia_)

plt.plot(range(1,11), inertias, marker='o')
plt.title('Elbow method')
plt.xlabel('Number of cluster')
plt.ylabel('Inertia')
plt.show()

Podemos ver que el «codo» en el gráfico de arriba (donde el interia se vuelve más lineal) está en K=2. Luego podemos ajustar nuestro algoritmo K-means una vez más y trazar los diferentes grupos asignados a los datos:

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

plt.scatter(x, y, c=kmeans.labels_)
plt.show()