2011-06-29 13 views
23

Utilizando el método plot(hclust(dist(x))), pude dibujar un mapa de árbol de clúster. Funciona. Sin embargo, me gustaría obtener una lista de todos los clústeres, no un diagrama de árbol, porque tengo una gran cantidad de datos (como nodos de 150 K) y la trama se complica.Lista de clustering para la función hclust

En otras palabras, digamos que si a b c es un grupo y si d e f g es un racimo entonces me gustaría conseguir algo como esto:

1 a,b,c 
2 d,e,f,g 

Tenga en cuenta que esto no es exactamente lo que yo quiero llegar como una "salida". Es solo un ejemplo. Me gustaría poder obtener una lista de conglomerados en lugar de una parcela de árbol. Podría ser un vector, una matriz o simplemente números simples que muestren a qué grupos pertenecen los elementos.

¿Cómo es esto posible?

+0

Esto puede ayudar. http://stackoverflow.com/questions/28378113/match-and-add-the-cluster-number-to-the-original-data/28384937#28384937 – EskimoT

Respuesta

34

Usaré el conjunto de datos disponible en R para demostrar cómo cortar un árbol en el número deseado de piezas. El resultado es una tabla.

Construya un objeto hclust.

hc <- hclust(dist(USArrests), "ave") 
#plot(hc) 

Ahora puede cortar el árbol en tantas ramas como desee. Para mi próximo truco, dividiré el árbol en dos grupos. Establece el número de cortes con el parámetro k. Consulte ?cutree y el uso del parámtero h que puede ser más útil para usted (consulte cutree(hc, k = 2) == cutree(hc, h = 110)).

cutree(hc, k = 2) 
     Alabama   Alaska  Arizona  Arkansas  California 
      1    1    1    2    1 
     Colorado Connecticut  Delaware  Florida  Georgia 
      2    2    1    1    2 
     Hawaii   Idaho  Illinois  Indiana   Iowa 
      2    2    1    2    2 
     Kansas  Kentucky  Louisiana   Maine  Maryland 
      2    2    1    2    1 
Massachusetts  Michigan  Minnesota Mississippi  Missouri 
      2    1    2    1    2 
     Montana  Nebraska   Nevada New Hampshire  New Jersey 
      2    2    1    2    2 
    New Mexico  New York North Carolina North Dakota   Ohio 
      1    1    1    2    2 
     Oklahoma   Oregon Pennsylvania Rhode Island South Carolina 
      2    2    2    2    1 
    South Dakota  Tennessee   Texas   Utah  Vermont 
      2    2    2    2    2 
     Virginia  Washington West Virginia  Wisconsin  Wyoming 
      2    2    2    2    2 
+0

¡excelente! gracias. Esto me hace pensar cómo uno puede aproximar un buen valor para el parámetro "k", de modo que la cantidad de clústeres en los datos sea la que debería ser en lugar de lo que yo quiero que sea. En otras palabras, ¿qué pasa si no sé cuántos cortes necesito hacer porque no sé cuántos conglomerados hay en los datos? De hecho, eso es lo que intento averiguar, es decir, la cantidad de clústeres y elementos dentro de cada grupo. Lo siento si no estaba claro antes. – dave

+0

@dave, ¿es posible que sepa a qué altura desea cortar el árbol? Si es así, use el parámetro 'h' (vea'? Cutree'). La función devolverá el número apropiado de grupos (y la lealtad de las hojas). –

+1

Veo, tal vez esto es lo que puedo hacer, los objetos ocultos tienen componentes como la matriz de fusión, alturas, etc. Digamos que si a es un objeto hclust, podemos acceder a las alturas posibles usando $ height.So quizás seleccionando la altura máxima desde esa matriz, posiblemente pueda averiguar la cantidad de clusters posibles. Eso es lo que pude encontrar a través de mi lectura. – dave

11

digamos,

y<-dist(x) 
clust<-hclust(y) 
groups<-cutree(clust, k=3) 
x<-cbind(x,groups) 

Ahora vas a conseguir para cada registro, el grupo de clústeres. También puede subconjunto el conjunto de datos:

x1<- subset(x, groups==1) 
x2<- subset(x, groups==2) 
x3<- subset(x, groups==3) 
Cuestiones relacionadas