memory-management - 实现层次聚类的数据结构

标签 memory-management data-structures machine-learning cluster-analysis hierarchical-clustering

如果我要实现一个分层聚类算法,例如用 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。如果我使用自上而下而不是自下而上构建相应的树状图,数据结构的选择是否会有所不同?

enter image description here

自下而上树状图的示例(来源,Wiki)

3.由于计算簇及其质心的问题是计算密集型(贪婪算法?) - 通过选择数据结构会变得更好 -您能想到哪些抽象选择?

4.真的有稀疏矩阵这样的东西吗[计算出2个点的接近度后,然后继续增长以同化更多相邻点,就会有如果我们将"new"距离存储在新的矩阵中]在这种情况下会更少点吗? 数据结构会因这种需要而缩小/增长吗?

5.这个矩阵是否可以存在于内存中,或其集群的一部分 - 如果不存在,我们在计算下一个矩阵之前必须将什么重新加载到内存中集群(凝聚集群或其他)

如果您坚持概念性(希望是直观的)答案/或将我重定向到那个方向,则+1

PPS:我不需要一个函数来帮助我实现这个 - 只是想从大型数据集的内存管理和概念角度来理解这一点。我对这个主题知之甚少,所以如果这听起来太原始,请忽略。

最佳答案

我建议你看看 R.Sibson 的 Slink 算法论文,它定义了一个名为 PointerHierarchy 的数据结构,使用它你可以在给定的距离上切割 Dandogram 以到达集群。该算法不需要您提前准备相似度矩阵,这会减少内存占用。本文还提供了 FORTRAN 中的示例实现,您可以轻松地用您选择的语言编写它。我在java的生产代码中使用了这个方法,效果非常好。

关于memory-management - 实现层次聚类的数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21284627/

相关文章:

tensorflow - 图像分类器总是给出相同的结果 : Out of Ideas

c - 使用for循环分配内存

algorithm - 您使用过 "Stack"对象 (.Net) 的哪些实际用途

mysql - where的哪些部分应用于存储引擎,哪些部分应用于MySQL?

machine-learning - NEAT 算法中调整的适应度

tensorflow - Tensorflow 中的回调

c++ - 使用私有(private)析构函数删除对象

python - Python 中的错误消息 "MemoryError"

memory-management - iOS RxSwift 如何在函数内部定义时理解可观察的生命周期

Python 图形结构和令人惊讶的列表处理