我正在使用层次聚类对我的数据进行分类。
我想定义最佳的簇数。为此,我们的想法是可视化一个图表,其中 x 轴是簇的数量,y 轴是树状图中树的高度。
为此,我需要知道指定簇数 K 时树的高度,例如如果 K=4,我需要在命令之后知道树的高度
cutree(hclust(dist(data), method = "ward.D"), k = 4)
有人可以帮忙吗?
高度存储在
hclust
对象中。 由于您没有提供任何数据,我将用内置的虹膜数据来说明。
HC = hclust(dist(iris[,1:4]), method="ward.D")
sort(HC$height)
<reduced output>
[133] 1.8215623 1.8787489 1.9240172 1.9508686 2.5143038 2.7244855
[139] 2.9123706 3.1111893 3.2054610 3.9028695 4.9516315 6.1980126
[145] 9.0114060 10.7530460 18.2425079 44.1751473 199.6204659
最大的值是第一个分割的高度。第二大的是第二次分割,等等。 您可以看到,这通过绘图给出了您需要的高度。
plot(HC)
abline(h=10.75,col="red")
您可以看到第四个最大的高度与第四个分割的高度相匹配。
cutree_k_to_h <- function(tree, k) {
if (is.null(n1 <- nrow(tree$merge)) || n1 < 1) {
cli::cli_abort("invalid {.arg tree} ({.field merge} component)")
}
n <- n1 + 1
if (is.unsorted(tree$height)) {
cli::cli_abort(
"the 'height' component of 'tree' is not sorted (increasingly)"
)
}
mean(tree$height[c(n - k, n - k + 1L)])
}
tree <- hclust(dist(iris[, 1:4]), method = "ward.D")
plot(tree)
abline(h = cutree_k_to_h(tree, 3), col = "red")