web-dev-qa-db-fra.com

Liste de clustering pour la fonction hclust

En utilisant la méthode plot(hclust(dist(x))), j'ai pu dessiner une carte d'arborescence de cluster. Ça marche. Pourtant, je voudrais obtenir une liste de tous les clusters, pas un diagramme d'arbre, car j'ai une énorme quantité de données (comme 150K nœuds) et l'intrigue devient désordonnée.

En d'autres termes, disons si a b c est un cluster et si d e f g est un cluster alors j'aimerais obtenir quelque chose comme ceci:

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

Veuillez noter que ce n'est pas exactement ce que je veux obtenir en tant que "sortie". Ce n'est qu'un exemple. J'aimerais simplement pouvoir obtenir une liste de clusters au lieu d'un arbre. Il peut s'agir de vecteurs, de matrices ou simplement de simples nombres qui montrent à quels groupes appartiennent les éléments.

Comment est-ce possible?

28
dave

J'utiliserai l'ensemble de données disponible dans R pour montrer comment couper un arbre en nombre souhaité de morceaux. Le résultat est un tableau.

Construisez un objet hclust.

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

Vous pouvez maintenant couper l'arbre en autant de branches que vous le souhaitez. Pour ma prochaine astuce, je vais diviser l'arbre en deux groupes. Vous définissez le nombre de coupes avec le paramètre k. Voir ?cutree Et l'utilisation du paramètre h qui peut vous être plus utile (voir 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
43
Roman Luštrik

disons,

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

vous obtiendrez maintenant pour chaque enregistrement, le groupe de clusters. Vous pouvez également sous-définir l'ensemble de données:

x1<- subset(x, groups==1)
x2<- subset(x, groups==2)
x3<- subset(x, groups==3)
16
user2783711