yo no usaría k-medias para detectar valores atípicos en un conjunto de datos multivariados, por la sencilla razón de que el algoritmo k-medias no está construido para tal fin: Siempre va a terminar con una solución que minimice la suma total de cuadrados dentro del clúster (y, por lo tanto, maximiza el SS entre clusters porque la varianza total es fija), y el valor atípico (s) no necesariamente definirá su propio clúster. Consideremos el siguiente ejemplo en I:
set.seed(123)
sim.xy <- function(n, mean, sd) cbind(rnorm(n, mean[1], sd[1]),
rnorm(n, mean[2],sd[2]))
# generate three clouds of points, well separated in the 2D plane
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)))
xy[1,] <- c(0,2) # convert 1st obs. to an outlying value
km3 <- kmeans(xy, 3) # ask for three clusters
km4 <- kmeans(xy, 4) # ask for four clusters
Como puede verse en la siguiente figura, el valor periférica no se recupera como tal: siempre pertenecerá a uno de los otros grupos.
Una posibilidad, sin embargo, sería el uso de un enfoque de dos etapas donde uno de eliminar puntos extremales (define aquí como vector lejos de sus centroides de grupo) de una manera iterativa, tal como se describe en el siguiente papel: Improving K-Means by Outlier Removal (Hautamäki, et al.).
Esto tiene cierta semejanza con lo que se hace en estudios genéticos para detectar y eliminar individuos que exhiben error de genotipado, o individuos que son hermanos/gemelos (o cuando queremos identificar la subestructura de la población), mientras que solo queremos mantener la relación individuos; en este caso, usamos escalamiento multidimensional (que es equivalente a PCA, hasta una constante para los dos primeros ejes) y eliminamos las observaciones por encima o por debajo de 6 SD en cualquiera de, digamos, los 10 o 20 ejes superiores (consulte, por ejemplo, Population Structure and Eigenanalysis Patterson et al., PLoS Genetics 2006 2 (12)).
Una alternativa común es utilizar ordenado robustos distancias de Mahalanobis que se pueden representar (en una parcela QQ) contra los cuantiles esperados de una distribución Chi-cuadrado, como se explica en el siguiente documento:
R.G. Garrett (1989). The chi-square plot: a tools for multivariate outlier recognition. Journal of Geochemical Exploration 32 (1/3): 319-341.
(Está disponible en el paquete mvoutlier R.)
Depende de lo que se llama a la entrada del usuario.Interpreto su pregunta como si algún algoritmo puede procesar automáticamente una matriz de distancia o datos sin procesar y detenerse en una cantidad óptima de conglomerados. Si este es el caso, y para cualquier algoritmo de partición basado en la distancia, entonces puede usar cualquiera de los índices de validez disponibles para el análisis de clúster; una buena descripción se da en
Handl, J., Knowles, J., and Kell, D.B. (2005). Computational cluster validation in post-genomic data analysis. Bioinformática 21 (15): 3201-3212.
que discutí en Cross Validated. Por ejemplo, puede ejecutar varias instancias del algoritmo en diferentes muestras aleatorias (usando bootstrap) de los datos, para un rango de números de clúster (por ejemplo, k = 1 a 20) y seleccionar k según los criterios optimizados que se consideraron (promedio ancho de la silueta, correlación cophenetic, etc.); puede ser completamente automatizado, sin necesidad de la intervención del usuario.
Existen otras formas de agrupación, basadas en la densidad (los conglomerados se consideran regiones donde los objetos son inusualmente comunes) o la distribución (los conglomerados son conjuntos de objetos que siguen una distribución de probabilidad determinada). La creación de clústeres basada en modelos, como se implementa en Mclust, por ejemplo, permite identificar clústeres en un conjunto de datos multivariados al abarcar un rango de forma para la matriz de varianza-covarianza para un número variable de clústeres y elegir el mejor modelo de acuerdo con el BIC criterio.
Esta pregunta cabría mejor en http://stats.stackexchange.com, IMO. – chl
¡Gran contribución a la comunidad SO! ¡Estos son temas muy importantes con los que debe lidiar todo programador! no puedo creer que esta pregunta haya sido cerrada! – Matteo