凝聚聚类的文档或代码示例
Documentation or code sample for agglomerative clustering
对于我的本科研究项目,我正在寻找用于凝聚聚类的 R 代码。基本上,我需要知道 R 中的 hclust 方法内部发生了什么。我到处都看过,但没有找到合适的方法来组合 2 个距离最小的数据点。在相异矩阵生成的第一阶段之后,我一直在开发相异矩阵(字面上我已经生成了第一个相异矩阵)。我没有指定 R,如果有人能用任何语言给我一个解决方案,我将不胜感激地接受。
当您在 R 中使用 hclust
时,您需要的所有信息都存储在函数的输出中。您可以只保存输出并读取您需要的内容。然而,输出可能不是完全透明的,所以我将通过一个非常小的例子,你可以将这些想法应用到你的数据中。
举个小例子,我将从内置的鸢尾花数据中随机抽取八个点,然后在这八个点上使用hclust
。由于我没有指定任何不同,'hclust` 使用默认的完整-link 聚类。
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。当我们使用 complete-link 时,该距离是如何计算的?它是点5与簇1中任意点之间的最大距离。我们从距离矩阵可以看出,点4与5之间的距离为0.6164414,点8与点5之间的距离为0.5830952,因此点5与点5之间的距离集群 1 为 0.6164414(完整 link 的最大值)。查看距离矩阵的其余部分,我们可以看到没有任何两个点的距离小于此距离,因此第二次合并是点 5 与簇 1 的距离为 0.6164414。 Tree1$merge
的第三行告诉我们,在第三步,我们合并点 3 和 7(标签 102 和 135)。 Tree1$height
的第三个条目告诉我们这次合并的距离是 0.7745967。
对于我的本科研究项目,我正在寻找用于凝聚聚类的 R 代码。基本上,我需要知道 R 中的 hclust 方法内部发生了什么。我到处都看过,但没有找到合适的方法来组合 2 个距离最小的数据点。在相异矩阵生成的第一阶段之后,我一直在开发相异矩阵(字面上我已经生成了第一个相异矩阵)。我没有指定 R,如果有人能用任何语言给我一个解决方案,我将不胜感激地接受。
当您在 R 中使用 hclust
时,您需要的所有信息都存储在函数的输出中。您可以只保存输出并读取您需要的内容。然而,输出可能不是完全透明的,所以我将通过一个非常小的例子,你可以将这些想法应用到你的数据中。
举个小例子,我将从内置的鸢尾花数据中随机抽取八个点,然后在这八个点上使用hclust
。由于我没有指定任何不同,'hclust` 使用默认的完整-link 聚类。
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。当我们使用 complete-link 时,该距离是如何计算的?它是点5与簇1中任意点之间的最大距离。我们从距离矩阵可以看出,点4与5之间的距离为0.6164414,点8与点5之间的距离为0.5830952,因此点5与点5之间的距离集群 1 为 0.6164414(完整 link 的最大值)。查看距离矩阵的其余部分,我们可以看到没有任何两个点的距离小于此距离,因此第二次合并是点 5 与簇 1 的距离为 0.6164414。 Tree1$merge
的第三行告诉我们,在第三步,我们合并点 3 和 7(标签 102 和 135)。 Tree1$height
的第三个条目告诉我们这次合并的距离是 0.7745967。