Как связать ветвь дендрограммы с классом?

Я создал классификацию и разделил набор данных радужной оболочки на три класса. После этого я хотел бы связать классы (цвета) с наблюдениями из набора данных. Я пытался использовать cutree функция. В результате у меня есть классы от 1 до 3 и ветви от 1 до 3, но они не совпадают - первый класс - это третья ветвь, второй класс - первая ветвь, а третий класс - второй. ветка. Как я могу правильно связать выходные классы (на основе cutree) а ветки в сюжете?

> 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)

> 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)

1 ответ

cutree Функция в пакете dendextend имеет аргумент под названием order_clusters_as_data это логический аргумент, который позволяет упорядочить кластеры по порядку исходных данных (ИСТИНА) или по порядку меток на дендрограмме (ЛОЖЬ). По умолчанию установлено значение TRUE, но, поскольку функция вырезания нумерует ветви в соответствии с порядком на дендрограмме, вы хотите 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)
Другие вопросы по тегам