当您在 R 中使用 hclust 时,您需要的所有信息都存储在函数的输出中。您可以保存输出并读取您需要的内容。但是,输出可能不是完全透明的,所以我将通过一个非常小的示例,您可以将这些想法应用到您的数据中。
举个小例子,我会从内置的虹膜数据中随机抽取八个点,然后在这八个点上使用hclust。由于我没有指定任何不同的内容,因此“hclust”使用默认的完整链接集群。
set.seed(2021)
S1 = sort(sample(150, 8))
Tree1 = hclust(dist(iris[S1,1:4]))
plot(Tree1, hang=-1)
正如我所说,hclust 的输出包含您需要的内容。它存储在 Tree1 中。实际上,它包含的内容比我想的要多。您可以通过运行 str(Tree1) 来查看其中的所有内容,但现在,我将专注于该结构的两个部分:Tree1$merge 和 Tree1$height。
Tree1$merge
[,1] [,2]
[1,] -4 -8
[2,] -5 1
[3,] -3 -7
[4,] -1 -2
[5,] -6 2
[6,] 3 4
[7,] 5 6
这些是什么意思?首先,Tree1$merge 告诉我们集群合并的顺序。第一行[1,] -4 -8 告诉我们,第一步是合并点 4(标记为 103)和点 8(标记为 140)形成簇 1。(点得到负数,由它们形成的簇得到正数。)下一行 [2,] -5 1 告诉我们第二步将点 5(标签为 105)与我们在上面从点 4 和 8 形成的集群 1 合并。其余行显示剩余的合并步骤。例如,最后一步合并集群 5 和 6。
好的,现在我们看到了集群合并的顺序,但是距离是多少?为什么是这个命令?我们从Tree1$height 得到它,当然它来自原始距离矩阵。所以我们也来看看距离矩阵。
Tree1$height
[1] 0.5477226 0.6164414 0.7745967 0.9848858 1.0148892 1.8000000 3.2511536
dist(iris[S1,1:4])
69 70 102 103 105 110 135
70 0.9848858
102 0.9643651 1.4696938
103 1.9416488 2.7386128 1.5684387
105 1.7058722 2.4248711 1.0770330 0.6164414
110 2.5534291 3.2511536 2.0322401 0.7549834 1.0148892
135 1.1789826 1.8000000 0.7745967 1.3190906 1.0000000 1.9157244
140 1.5716234 2.3021729 1.2247449 0.5477226 0.5830952 0.9949874 1.1916375
注意Tree1$height 中的第一个条目是 0.5477226,即第四个点 (103) 和第八个点 (140) 之间的距离。这是距离矩阵中的最小距离,这就是首先合并这些点的原因。回想一下,下一次合并是点 5 (105) 与集群 1。当我们使用完整链接时,该距离是如何计算的?它是点 5 到簇 1 中任意点的最大距离。从距离矩阵可以看出,点 4 和点 5 的距离是 0.6164414,点 8 和点 5 的距离是 0.5830952,所以点 5 之间的距离集群 1 为 0.6164414(完整链接的最大值)。查看距离矩阵的其余部分,我们可以看到没有两个点的距离小于此值,因此第二次合并是点 5 与簇 1 的距离为 0.6164414。 Tree1$merge 的第三行告诉我们,在第三步,我们合并了点 3 和 7(标签 102 和 135)。 Tree1$height 的第三个条目告诉我们这次合并的距离是 0.7745967。