如果我要实现一个分层聚类算法,例如用 C/C++ 或 Java 实现 - 给定计算聚类之间和聚类内距离的函数 -
1。我会选择什么(以及其他选项)来实现数据结构来存储来自邻近度度量(下面定义为 n^2)的每个“ channel ”中的计算集群的结果。
Corresponding Proximity matrix p1 p2 p3 p4 .... and hence n*n p1 d11 d12 d13 d14 p2 ... p3... p4 ...
2。如果我使用自上而下而不是自下而上构建相应的树状图,数据结构的选择是否会有所不同?
自下而上树状图的示例(来源,Wiki)
3.由于计算簇及其质心的问题是计算密集型(贪婪算法?) - 通过选择数据结构会变得更好 -您能想到哪些抽象选择?
4.真的有稀疏矩阵这样的东西吗[计算出2个点的接近度后,然后继续增长以同化更多相邻点,就会有如果我们将"new"距离存储在新的矩阵中]在这种情况下会更少点吗? 数据结构会因这种需要而缩小/增长吗?
5.这个矩阵是否可以存在于内存中,或其集群的一部分 - 如果不存在,我们在计算下一个矩阵之前必须将什么重新加载到内存中集群(凝聚集群或其他)
如果您坚持概念性(希望是直观的)答案/或将我重定向到那个方向,则+1
PPS:我不需要一个函数来帮助我实现这个 - 只是想从大型数据集的内存管理和概念角度来理解这一点。我对这个主题知之甚少,所以如果这听起来太原始,请忽略。
最佳答案
我建议你看看 R.Sibson 的 Slink 算法论文,它定义了一个名为 PointerHierarchy 的数据结构,使用它你可以在给定的距离上切割 Dandogram 以到达集群。该算法不需要您提前准备相似度矩阵,这会减少内存占用。本文还提供了 FORTRAN 中的示例实现,您可以轻松地用您选择的语言编写它。我在java的生产代码中使用了这个方法,效果非常好。
关于memory-management - 实现层次聚类的数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21284627/