Al ser un novato en R, no estoy muy seguro de cómo elegir el mejor número de grupos para hacer un análisis de k-medias. Después de trazar un subconjunto de datos a continuación, ¿cuántos grupos serán apropiados? ¿Cómo puedo realizar el análisis dendro de clúster?
n = 1000
kk = 10
x1 = runif(kk)
y1 = runif(kk)
z1 = runif(kk)
x4 = sample(x1,length(x1))
y4 = sample(y1,length(y1))
randObs <- function()
{
ix = sample( 1:length(x4), 1 )
iy = sample( 1:length(y4), 1 )
rx = rnorm( 1, x4[ix], runif(1)/8 )
ry = rnorm( 1, y4[ix], runif(1)/8 )
return( c(rx,ry) )
}
x = c()
y = c()
for ( k in 1:n )
{
rPair = randObs()
x = c( x, rPair[1] )
y = c( y, rPair[2] )
}
z <- rnorm(n)
d <- data.frame( x, y, z )
r
cluster-analysis
k-means
usuario2153893
fuente
fuente
fpc
paquete. Es cierto, luego debe establecer dos parámetros ... pero descubrí quefpc::dbscan
hace un trabajo bastante bueno para determinar automáticamente un buen número de clústeres. Además, en realidad puede generar un solo clúster si eso es lo que le dicen los datos: algunos de los métodos en las excelentes respuestas de @ Ben no lo ayudarán a determinar si k = 1 es realmente el mejor.Respuestas:
Si su pregunta es
how can I determine how many clusters are appropriate for a kmeans analysis of my data?
, entonces aquí hay algunas opciones. El artículo de Wikipedia sobre la determinación de la cantidad de grupos tiene una buena revisión de algunos de estos métodos.Primero, algunos datos reproducibles (los datos en la Q son ... poco claros para mí):
Uno . Busque una curva o codo en la gráfica de suma de error al cuadrado (SSE). Consulte http://www.statmethods.net/advstats/cluster.html y http://www.mattpeeples.net/kmeans.html para obtener más información. La ubicación del codo en la gráfica resultante sugiere un número adecuado de grupos para los medios:
Podríamos concluir que 4 grupos serían indicados por este método:
Dos . Puede realizar particiones alrededor de medoides para estimar el número de clústeres utilizando la
pamk
función en el paquete fpc.Tres . Criterio de Calinsky: otro enfoque para diagnosticar cuántos grupos se adaptan a los datos. En este caso tratamos de 1 a 10 grupos.
Cuatro . Determine el modelo óptimo y el número de grupos según el Criterio de información bayesiano para la maximización de expectativas, inicializado por agrupamiento jerárquico para modelos de mezcla gaussiana parametrizados
Cinco . Agrupación de propagación de afinidad (AP), consulte http://dx.doi.org/10.1126/science.1136800
Seis . Estadística de brecha para estimar el número de grupos. Vea también algo de código para una buena salida gráfica . Tratando de 2 a 10 grupos aquí:
Aquí está el resultado de la implementación de la estadística de brecha de Edwin Chen:
Siete . También puede resultarle útil explorar sus datos con clustergramas para visualizar la asignación de clústeres, consulte http://www.r-statistics.com/2010/06/clustergram-visualization-and-diagnostics-for-cluster-analysis-r- código / para más detalles.
Ocho . El paquete NbClust proporciona 30 índices para determinar la cantidad de clústeres en un conjunto de datos.
Si su pregunta es
how can I produce a dendrogram to visualize the results of my cluster analysis
, entonces debe comenzar con estos: http://www.statmethods.net/advstats/cluster.html http://www.r-tutor.com/gpu-computing/clustering/hierarchical-cluster-analysis http://gastonsanchez.wordpress.com/2012/10/03/7-ways-to-plot-dendrograms-in-r/ Y vea aquí para obtener métodos más exóticos: http://cran.r-project.org/ web / views / Cluster.htmlAquí están algunos ejemplos:
También para datos de alta dimensión está la
pvclust
biblioteca que calcula los valores p para la agrupación jerárquica a través del remuestreo bootstrap multiescala. Aquí está el ejemplo de la documentación (no funcionará en datos de dimensiones tan bajas como en mi ejemplo):¿Algo de eso ayuda?
fuente
R
paquetes (está en mi GitHub, puedes echar un vistazo); 3) mi solución parece funcionar lo suficientemente bien, además, ha pasado un tiempo y ya he finalizado mi software de tesis, informe de tesis (tesis) y actualmente me estoy preparando para la defensa :-). De todos modos, agradezco mucho su comentario y enlaces. ¡Todo lo mejor!Es difícil agregar algo también una respuesta tan elaborada. Aunque creo que deberíamos mencionarlo
identify
aquí, particularmente porque @Ben muestra muchos ejemplos de dendrogramas.identify
le permite elegir interactivamente grupos de un dendrograma y almacena sus elecciones en una lista. Pulsa Esc para salir del modo interactivo y volver a la consola R. Tenga en cuenta que la lista contiene los índices, no los nombres de fila (en oposición acutree
).fuente
Para determinar el k-cluster óptimo en los métodos de agrupamiento. Usualmente uso el
Elbow
método acompañado por el procesamiento en paralelo para evitar el consumo de tiempo. Este código puede muestrear así:Método del codo
Ejecución de codo paralelo
Funciona bien.
fuente
Espléndida respuesta de Ben. Sin embargo, me sorprende que el método de Propagación de afinidad (AP) se haya sugerido aquí solo para encontrar el número de clúster para el método k-means, donde en general AP hace un mejor trabajo agrupando los datos. Consulte el documento científico que respalda este método en Science aquí:
Frey, Brendan J. y Delbert Dueck. "Agrupación al pasar mensajes entre puntos de datos". Science 315.5814 (2007): 972-976.
Entonces, si no está predispuesto hacia k-means, sugiero usar AP directamente, que agrupará los datos sin requerir conocer el número de grupos:
Si las distancias euclidianas negativas no son apropiadas, puede usar otras medidas de similitud proporcionadas en el mismo paquete. Por ejemplo, para similitudes basadas en correlaciones de Spearman, esto es lo que necesita:
Tenga en cuenta que esas funciones para similitudes en el paquete AP solo se proporcionan por simplicidad. De hecho, la función apcluster () en R aceptará cualquier matriz de correlaciones. Lo mismo antes con corSimMat () se puede hacer con esto:
o
dependiendo de lo que desee agrupar en su matriz (filas o columnas).
fuente
Estos métodos son geniales, pero cuando se trata de encontrar k para conjuntos de datos mucho más grandes, estos pueden ser muy lentos en R.
Una buena solución que he encontrado es el paquete "RWeka", que tiene una implementación eficiente del algoritmo X-Means, una versión extendida de K-Means que se escala mejor y determinará el número óptimo de grupos para usted.
Primero querrá asegurarse de que Weka esté instalado en su sistema y que XMeans esté instalado a través de la herramienta de administración de paquetes de Weka.
fuente
Una solución simple es la biblioteca
factoextra
. Puede cambiar el método de agrupación y el método para calcular la mejor cantidad de grupos. Por ejemplo, si desea conocer el mejor número de clústeres para un k- significa:Datos: mtcars
Finalmente, obtenemos un gráfico como:
fuente
Las respuestas son geniales. Si desea dar una oportunidad a otro método de agrupación, puede utilizar la agrupación jerárquica y ver cómo se dividen los datos.
Dependiendo de cuántas clases necesite, puede cortar su dendrograma como;
Si escribe
?cutree
, verá las definiciones. Si su conjunto de datos tiene tres clases, será simplementecutree(hc.complete, k = 3)
. El equivalente paracutree(hc.complete,k = 2)
escutree(hc.complete,h = 4.9)
.fuente