sklearn means example ejemplo code cluster python machine-learning scikit-learn cluster-analysis k-means

python - example - Scikit Learn-K-Means-Codo-criterio



plot k means python (2)

Hoy estoy tratando de aprender algo acerca de K-means. Tengo que entender el algoritmo y sé cómo funciona. Ahora estoy buscando el k correcto ... ¡Encontré el criterio del codo como un método para detectar el k correcto pero no entiendo cómo usarlo con scikit learn! En scikit aprende que estoy agrupando las cosas de esta manera.

kmeans = KMeans(init=''k-means++'', n_clusters=n_clusters, n_init=10) kmeans.fit(data)

Entonces, ¿debo hacer esto varias veces para n_clusters = 1 ... n y ver la tasa de error para obtener el k correcto? ¿Crees que esto sería estúpido y tomaría mucho tiempo?


El criterio del codo es un método visual. Todavía no he visto una definición matemática robusta de ello. Pero k-means es una heurística bastante burda, también.

Entonces sí, deberá ejecutar k-means con k=1...kmax , luego trazar el SSQ resultante y decidir sobre un k "óptimo".

Existen versiones avanzadas de k-medias como X-medias que comenzarán con k=2 y luego las aumentarán hasta que un criterio secundario (AIC / BIC) ya no mejore. Bisecar k-medias es un enfoque que también comienza con k = 2 y luego divide los grupos hasta que k = kmax. Probablemente podría extraer los SSQs provisionales de él.

De cualquier manera, tengo la impresión de que en cualquier caso de uso real en el que k-mean sea realmente bueno, usted sabe de antemano la k que necesita. En estos casos, k-means no es en realidad un algoritmo de "agrupación", sino un algoritmo de cuantificación vectorial . Por ejemplo, reducir el número de colores de una imagen a k. (donde a menudo escogería k para ser, por ejemplo, 32, porque esa es entonces una profundidad de color de 5 bits y puede almacenarse de forma comprimida en bits). O, por ejemplo, en los enfoques de bolsa de palabras visuales, donde elegiría el tamaño del vocabulario manualmente. Un valor popular parece ser k = 1000. Entonces, realmente no le importa mucho la calidad de los "grupos", pero el punto principal es poder reducir una imagen a un vector disperso de 1000 dimensiones. El rendimiento de una representación dimensional 900 o 1100 no será sustancialmente diferente.

Para las tareas de agrupación en clúster reales, es decir, cuando desea analizar los clústeres resultantes de forma manual , las personas suelen utilizar métodos más avanzados que k-means. K-means es más una técnica de simplificación de datos.


Si la etiqueta verdadera no se conoce de antemano (como en su caso), entonces la K-Means clustering puede evaluarse utilizando el Criterio de codo o el Coeficiente de silueta.

Método de criterio del codo:

La idea detrás del método del codo es ejecutar k-means clustering en un conjunto de datos dado para un rango de valores de k ( num_clusters , por ejemplo, k = 1 a 10), y para cada valor de k, calcular la suma de errores cuadrados (SSE).

Después de eso, traza un gráfico de líneas del SSE para cada valor de k. Si el gráfico de líneas se ve como un brazo: un círculo rojo debajo del gráfico de líneas (como el ángulo), el "codo" en el brazo es el valor de k óptimo (número de grupos). Aquí, queremos minimizar el SSE. El SSE tiende a disminuir hacia 0 a medida que aumentamos k (y SSE es 0 cuando k es igual al número de puntos de datos en el conjunto de datos, porque entonces cada punto de datos es su propio grupo, y no hay ningún error entre este y el centro de su cluster).

Entonces, el objetivo es elegir un small value of k que aún tenga un SSE bajo, y el codo generalmente representa donde comenzamos a tener rendimientos decrecientes al aumentar k.

Consideremos los conjuntos de datos del iris,

import pandas as pd from sklearn.datasets import load_iris from sklearn.cluster import KMeans import matplotlib.pyplot as plt iris = load_iris() X = pd.DataFrame(iris.data, columns=iris[''feature_names'']) #print(X) data = X[[''sepal length (cm)'', ''sepal width (cm)'', ''petal length (cm)'']] sse = {} for k in range(1, 10): kmeans = KMeans(n_clusters=k, max_iter=1000).fit(data) data["clusters"] = kmeans.labels_ #print(data["clusters"]) sse[k] = kmeans.inertia_ # Inertia: Sum of distances of samples to their closest cluster center plt.figure() plt.plot(list(sse.keys()), list(sse.values())) plt.xlabel("Number of cluster") plt.ylabel("SSE") plt.show()

Parcela para el código anterior:

Podemos ver en la gráfica, 3 es el número óptimo de agrupaciones (con un círculo rojo) para el conjunto de datos del iris, lo que de hecho es correcto.



Método del coeficiente de silueta:

De la documentación sklearn ,

Una puntuación más alta del coeficiente de silueta se relaciona con un modelo con grupos mejor definidos. El coeficiente de silueta se define para cada muestra y se compone de dos puntuaciones: `

a: La distancia media entre una muestra y todos los demás puntos en la misma clase.

b: La distancia media entre una muestra y todos los demás puntos en el siguiente grupo más cercano.

El coeficiente de silueta es para una sola muestra y luego se da como:

Ahora, para encontrar el valor óptimo de k para KMeans , recorre 1..n para n_clusters en KMeans y calcule el coeficiente de silueta para cada muestra.

Un coeficiente de silueta más alto indica que el objeto está bien adaptado a su propio grupo y no está bien ajustado a los grupos vecinos.

from sklearn.metrics import silhouette_score from sklearn.datasets import load_iris from sklearn.cluster import KMeans X = load_iris().data y = load_iris().target for n_cluster in range(2, 11): kmeans = KMeans(n_clusters=n_cluster).fit(X) label = kmeans.labels_ sil_coeff = silhouette_score(X, label, metric=''euclidean'') print("For n_clusters={}, The Silhouette Coefficient is {}".format(n_cluster, sil_coeff))

Salida -

Para n_clusters = 2, el coeficiente de silueta es 0.680813620271
Para n_clusters = 3, el coeficiente de silueta es 0.552591944521
Para n_clusters = 4, el coeficiente de silueta es 0.496992849949
Para n_clusters = 5, el coeficiente de silueta es 0.488517550854
Para n_clusters = 6, el coeficiente de silueta es 0.370380309351
Para n_clusters = 7, el coeficiente de silueta es 0.356303270516
Para n_clusters = 8, el coeficiente de silueta es 0.365164535737
Para n_clusters = 9, el coeficiente de silueta es 0.346583642095
Para n_clusters = 10, el coeficiente de silueta es 0.328266088778

Como podemos ver, n_clusters = 2 tiene el coeficiente de silueta más alto. Esto significa que 2 debe ser el número óptimo de clúster, ¿verdad?

Pero aquí está la trampa.

El conjunto de datos del iris tiene 3 especies de flores, lo que contradice a los 2 como un número óptimo de conglomerados. Entonces, a pesar de que n_clusters = 2 tenga el mayor coeficiente de silueta, consideraríamos n_clusters = 3 como el número óptimo de cluster debido a:

  1. El conjunto de datos del iris tiene 3 especies. (Lo más importante)
  2. n_clusters = 2 tiene un segundo valor más alto de coeficiente de silueta.

Así que elegir n_clusters = 3 es el no óptimo. de cluster para el conjunto de datos del iris.

Elegir el no óptimo. del clúster dependerá del tipo de conjuntos de datos y del problema que intentemos resolver. Pero la mayoría de los casos, tomando el coeficiente de silueta más alto producirá un número óptimo de agrupación.

¡Espero eso ayude!