Acerca de k-means específicamente, puede usar las estadísticas Gap. Básicamente, la idea es calcular una bondad de medida de agrupación basada en la dispersión promedio en comparación con una distribución de referencia para un número creciente de agrupaciones. Se puede encontrar más información en el documento original:
Tibshirani, R., Walther, G. y Hastie, T. (2001). Estimación del número de clústeres en un conjunto de datos a través de la estadística de brecha . JR Statist. Soc. B, 63 (2): 411-423.
La respuesta que proporcioné a una pregunta relacionada destaca otros índices de validez generales que podrían usarse para verificar si un conjunto de datos dado exhibe algún tipo de estructura.
Cuando no tiene idea de lo que esperaría encontrar si solo hubiera ruido, un buen enfoque es utilizar un nuevo muestreo y estudiar la estabilidad de los clústeres. En otras palabras, vuelva a muestrear sus datos (mediante bootstrap o agregando un pequeño ruido) y calcule la "cercanía" de las particiones resultantes, según lo medido por las similitudes de Jaccard . En resumen, permite estimar la frecuencia con la que se recuperaron grupos similares en los datos. Este método está fácilmente disponible en el paquete fpc R como clusterboot()
. Toma como entrada datos sin procesar o una matriz de distancia, y permite aplicar una amplia gama de métodos de agrupamiento (métodos jerárquicos, k-medios, difusos). El método se discute en las referencias vinculadas:
Hennig, C. (2007) Evaluación basada en el clúster de la estabilidad del clúster .
Estadística computacional y análisis de datos , 52, 258-271.
Hennig, C. (2008) Punto de disolución y solidez del aislamiento: criterios de solidez para los métodos generales de análisis de conglomerados . Journal of Multivariate Analysis , 99, 1154-1176.
A continuación se muestra una pequeña demostración con el algoritmo k-means.
sim.xy <- function(n, mean, sd) cbind(rnorm(n, mean[1], sd[1]),
rnorm(n, mean[2],sd[2]))
xy <- rbind(sim.xy(100, c(0,0), c(.2,.2)),
sim.xy(100, c(2.5,0), c(.4,.2)),
sim.xy(100, c(1.25,.5), c(.3,.2)))
library(fpc)
km.boot <- clusterboot(xy, B=20, bootmethod="boot",
clustermethod=kmeansCBI,
krange=3, seed=15555)
Los resultados son bastante positivos en este conjunto de datos artificial (y bien estructurado) ya que ninguno de los tres grupos ( krange
) se disolvió en las muestras, y la similitud promedio de Jaccard clúster es> 0.95 para todos los grupos.
A continuación se muestran los resultados de las 20 muestras de bootstrap. Como puede verse, las unidades estadísticas tienden a permanecer agrupadas en el mismo grupo, con pocas excepciones para las observaciones intermedias.
Puede extender esta idea a cualquier índice de validez, por supuesto: elija una nueva serie de observaciones por bootstrap (con reemplazo), calcule su estadística (por ejemplo, ancho de silueta, correlación cophenetic, gamma de Hubert, dentro de la suma de cuadrados) para un rango de números de clúster (p. ej., 2 a 10), repita 100 o 500 veces y observe el diagrama de caja de su estadística en función del número de clúster.
Esto es lo que obtengo con el mismo conjunto de datos simulado, pero usando el agrupamiento jerárquico de Ward y considerando la correlación cophenetic (que evalúa qué tan bien se reproduce la información de distancia en las particiones resultantes) y el ancho de la silueta (una medida combinada que evalúa la homogeneidad intra-cluster e inter separación de racimos).
La correlación cophenetic varía de 0.6267 a 0.7511 con un valor medio de 0.7031 (500 muestras de bootstrap). El ancho de la silueta parece ser máximo cuando consideramos 3 grupos (mediana 0.8408, rango 0.7371-0.8769).