2017-05-08 4 views
0

Je suis actuellement en train d'examiner la hiérarchie dans les rubriques de documents. Dans un premier temps, je trouve une représentation vectorielle de mes documents, après quoi j'utilise la classification hiérarchique pour déterminer s'il y a des sujets dans les rubriques du document. Je veux seulement considérer les groupes (imbriqués) qui contiennent au moins 2% de données originales. Pour ce faire, j'utilise R.Obtention de hiérarchie de clusters et d'affectations de clusters imbriqués

Maintenant, je suis aux prises avec l'extraction efficace de la hiérarchie de cluster à partir des résultats de la mise en cluster. Le regroupement est effectué avec le package "fastcluster", qui fournit des résultats similaires à la fonction "hclust" d'origine.

Pour ma sortie finale devrait ressembler à quelque chose comme ceci; il y aura deux tables

Affectations de cluster:

docID , ClusterLabel 
1, A 
2, A 
3, B 
4, B 
5, B 
3, C 
4, D 
5, C 
... 

Cluster Hiérarchie:

Parent, Child 
B, C 
B, D 
... 

Comme vous pouvez le voir, les observations 3,4 et 5 se produisent plusieurs fois dans le tableau d'affectation de cluster, où l'un des clusters est un sous-cluster de son cluster parent. Cela peut être vu dans le tableau Hiérarchie. Mon approche actuelle consiste à utiliser la fonction cutree.dendogram du package "Dendextend" pour trouver l'affectation de cluster pour une grille de valeurs de k, puis déduire la hiérarchie de cluster et les affectations de la sortie. Cependant, cette approche est très naïve et devient terriblement lente pour un grand nombre d'observations et de groupes.

Des suggestions sur la façon d'aborder ce problème de manière efficace, de préférence en utilisant certains paquets facilement disponibles seraient grandement appréciées.

EDIT: Prenons l'exemple suivant, correspondant aux données de sortie de l'échantillon:

data <- matrix(data = c(1,2,3,4,5,1,3,5,9,10), nrow = 5, ncol = 2) 
plot(data) 

hc<- hclust(dist(data)) 
plot(hc) 

Si nous couper l'arbre à la hauteur 6, on obtiendrait 2 groupes, nommés A et B dans la sortie. Cependant, si nous devions couper l'arbre à la hauteur 4, nous aurions 3 groupes, nommés A, C et D dans la sortie. Par exemple, l'observation avec docID 3 se trouve soit dans le cluster B, soit dans le cluster C (en fonction de la hauteur de coupe de l'arborescence), ce qui correspond aux deux entrées de l'affectation du cluster de sortie de l'exemple. Le cluster B est divisé dans les deux groupes C et D, visibles dans la sortie Hierachy du cluster.

Maintenant, mon objectif est d'obtenir la liste complète des assignations de grappes et des hiérarchies, en descendant le dendrogramme. (Arrêter de préférence lorsque la quantité d'observations dans un (sous-) groupe obtient moins qu'un certain nombre d'observations)

Jusqu'à présent, je n'ai pas réussi à trouver une méthode efficace raisonnable pour ce faire, j'espère que tout le monde pourrait me fournir un idée.

+0

Salut @ Bartdp1, pourriez-vous s'il vous plaît mettre à jour votre question avec un exemple reproductible autonome? –

+0

@TalGalili J'ai mis à jour la question, merci de jeter un oeil – BDP1

Répondre

1

Le paramètre k dans la fonction cutree peut recevoir un vecteur de valeurs et la sortie se présente comme suit:

> data <- matrix(data = c(1,2,3,4,5,1,3,5,9,10), nrow = 5, ncol = 2) 
> hc<- hclust(dist(data)) 
> cutree(hc, k = 1:5) 
    1 2 3 4 5 
[1,] 1 1 1 1 1 
[2,] 1 1 1 2 2 
[3,] 1 1 2 3 3 
[4,] 1 2 3 4 4 
[5,] 1 2 3 4 5 

Est-ce que cette réponse à votre question?

+0

Pas exactement, notez que lorsque vous passez de 2 à 3 clusters, le cluster "1" de la colonne 2 est divisé en deux clusters, nommés cluster "1" et cluster "2" dans la colonne 3. Les deux derniers sont des "enfants" du premier. Je veux maintenir la distinction entre deux, donc ils devraient avoir des étiquettes distinctes (maintenant, ce n'est pas le cas, puisque l'étiquette "1" apparaît deux fois). Bien sûr, je peux voir qu'il est possible de dériver tout cela à partir de la sortie que vous fournissez, mais cela serait plutôt cher, étant donné que l'information est facilement disponible à partir du dendrogramme. Je ne vois tout simplement pas comment l'extraire efficacement. – BDP1

+0

Je ne suis pas sûr de suivre. Vous voulez que la deuxième colonne ait seulement 2 et 3, et la troisième pour avoir 3,4,5 - etc? –

+0

Pas perse. Au début, je cherche à extraire d'une sortie hclust la sortie de l'échantillon comme montré dans la question initiale. Donc, je veux une liste avec des affectations de cluster. Les observations se produisent plusieurs fois dans cette liste, car lorsqu'une clusers est fusionnée dans un clustering hiérarchique, une observation est à la fois dans les clusters "parent" et "enfant". De plus, je voudrais obtenir une liste des relations partent-> enfants. Pour l'anecdote, je ne suis pas sûr que dendextend ait cette fonctionnalité (ou des parties de celle-ci à utiliser), mais j'espérais une poussée dans la bonne direction sur la façon de coder efficacement cela. – BDP1