1

J'ai créé une classification et divisé le jeu de données iris en trois classes. Par la suite, je voudrais lier les classes (couleurs) aux observations de l'ensemble de données. J'ai essayé d'utiliser une fonction cutree. En conséquence, j'ai des classes de 1 à 3 et des branches de 1 à 3, mais elles ne sont pas les mêmes - la première classe est la troisième branche, la deuxième classe est la première branche et la troisième classe est la seconde branche. Comment puis-je lier correctement les classes de sortie (basées sur cutree) et les branches d'une parcelle?Comment lier une branche de dendrogramme à une classe?

> library('dendextend') 
> library('tidyverse') 
> iris <- datasets::iris 
> iris2 <- iris[,-5] 
> d_iris <- dist(iris2) 
> hc_iris <- hclust(d_iris, method = "complete") 
> dend <- as.dendrogram(hc_iris) 
> dend <- color_branches(dend, h = 3.5) 
> dend <- color_labels(dend, h = 3.5) 
> plot(dend) 

enter image description here

> cuts <- cutree(dend, h=3.5) 
> data_frame(class=cuts, obj=as.numeric(names(cuts))) %>% 
+   group_by(class) %>% 
+   summarise(n()) 
# A tibble: 3 × 2 
    class `n()` 
    <int> <int> 
1  1 50 
2  2 72 
3  3 28 
> plot(cut(dend, h=3.5)$upper) 

enter image description here

Répondre

1

Le cutreefunction dans le package dendextend a un argument appelé order_clusters_as_data qui est un argument logique qui vous permet de commander les grappes par l'ordre de l'original données (TRUE) ou par l'ordre des étiquettes sur le dendrogramme (FALSE). La valeur par défaut est TRUE, mais comme la fonction de coupure numérote les branches en fonction de l'ordre du dendrogramme, vous voulez order_clusters_as_data = FALSE:

cuts <- cutree(dend, h=3.5, order_clusters_as_data=FALSE) 
data_frame(class=cuts, obj=as.numeric(names(cuts))) %>% 
    group_by(class) %>% 
    summarise(n()) 
# A tibble: 3 × 2 
    class `n()` 
    <int> <int> 
1  1 72 
2  2 28 
3  3 50 
plot(cut(dend, h=3.5)$upper)