Я предлагаю вам использовать функцию cutree
из dendextend. пакет. Он включает в себя метод дендрограммы (т.е.: dendextend:::cutree.dendrogram
).
Подробнее о пакете можно узнать из его вводной виньетки< /а>.
Я должен добавить, что хотя ваша функция (classify
) хороша, есть несколько преимуществ использования cutree
из dendextend:
Это также позволяет вам использовать конкретное k
(количество кластеров), а не только h
(определенную высоту).
Это согласуется с результатом, который вы получите от cutree на hclust (classify
не будет).
Часто это будет быстрее.
Вот примеры использования кода:
# Toy data:
hc <- hclust(dist(USArrests), "ave")
dend1 <- as.dendrogram(hc)
# Get the package:
install.packages("dendextend")
library(dendextend)
# Get the package:
cutree(dend1,h=70) # it now works on a dendrogram
# It is like using:
dendextend:::cutree.dendrogram(dend1,h=70)
Кстати, на основе этой функции dendextend позволяет пользователю делать более интересные вещи, например, раскрашивать ветки/метки на основе разрезания дендрограммы:
dend1 <- color_branches(dend1, k = 4)
dend1 <- color_labels(dend1, k = 5)
plot(dend1)
Наконец, вот еще немного кода для демонстрации других моих моментов:
# This would also work with k:
cutree(dend1,k=4)
# and would give identical result as cutree on hclust:
identical(cutree(hc,h=70) , cutree(dend1,h=70) )
# TRUE
# But this is not the case for classify:
identical(classify(dend1,70) , cutree(dend1,h=70) )
# FALSE
install.packages("microbenchmark")
require(microbenchmark)
microbenchmark(classify = classify(dend1,70),
cutree = cutree(dend1,h=70) )
# Unit: milliseconds
# expr min lq median uq max neval
# classify 9.70135 9.94604 10.25400 10.87552 80.82032 100
# cutree 37.24264 37.97642 39.23095 43.21233 141.13880 100
# 4 times faster for this tree (it will be more for larger trees)
# Although (if to be exact about it) if I force cutree.dendrogram to not go through hclust (which can happen for "weird" trees), the speed will remain similar:
microbenchmark(classify = classify(dend1,70),
cutree = cutree(dend1,h=70, try_cutree_hclust = FALSE) )
# Unit: milliseconds
# expr min lq median uq max neval
# classify 9.683433 9.819776 9.972077 10.48497 29.73285 100
# cutree 10.275839 10.419181 10.540126 10.66863 16.54034 100
Если вы думаете о том, как улучшить эту функцию, исправьте ее здесь:
https://github.com/talgalili/dendextend/blob/master/R/cutree.dendrogram.R
Я надеюсь, что вы или другие люди найдете этот ответ полезным.
person
Tal Galili
schedule
25.08.2014