【问题标题】:How to do Hierarchical Clustering for large similarity matrix如何对大相似度矩阵进行层次聚类
【发布时间】:2015-10-17 19:15:19
【问题描述】:

我有大约 50K 数据集,其值可能在 0 到 10 之间。我想应用 HAC 对这些数据进行聚类。但是要应用 HAC,我需要准备一个 N*N 相似度矩阵。

对于 N = 50 K ,即使我使用 short ,这个矩阵也会太大而无法保存在内存中。

是否有任何方法可以批量执行 HAC 或任何其他方法可以帮助我应用具有 50K 数据点的 HAC。我打算用java实现它。

我也担心这需要花费的总时间,任何有关这方面的建议都会很有帮助。

【问题讨论】:

    标签: machine-learning hierarchical-clustering unsupervised-learning


    【解决方案1】:

    如果您想应用自上而下的聚类方法,您可以轻松分发它,相关文章:http://scgroup.hpclab.ceid.upatras.gr/faculty/stratis/Papers/tm07book.pdf

    长话短说(引用其他文章):在您的第一个节点拆分后,创建的每个节点都可以运送到分布式进程以再次拆分,依此类推......每个分布式进程只需要知道子集它正在拆分的数据集。只有父进程知道完整的数据集。

    自下而上的方法更难分发,我不会在这里尝试提出任何建议。

    但是,嘿,您不需要自己用 Java 编写它,Mahout 或 MLLib 库已经有了它,并且它们支持 java.util.还有hadoop

    无论如何,如果您想自己编写,这里是您在 Java 中的 hadoop 示例: http://sujitpal.blogspot.ru/2009/09/hierarchical-agglomerative-clustering.html

    最后,关于层次聚类的不同分布式方法的比较的一项伟大而伟大的工作:

    C. F. Olson. "Parallel Algorithms for Hierarchical Clustering." Parallel Computing, 21:1313-1325, 1995, doi:10.1016/0167-8191(95)00017-I.
    

    【讨论】:

    • 感谢您的意见。现在我正在寻找一种可以在单机上运行的解决方案。我已经阅读了自上而下的方法,但根据 wiki,它的时间复杂度可能是 2^N,甚至比 N^2 或 N^3 还要差。我知道 Mahout 不支持 HAC。
    • 然后使用 scikit-learn。 50K 数据点 + HAC 就可以了,我曾经用它对一组 100K 文档进行聚类,它对我来说效果很好 - 在 ordinal Core 2 Duo PC 上花了大约 5-10 分钟。
    • 你的意思是 100k * 100k 相似度可以在 10 分钟内完成?你用的是自上而下还是自下而上?您选择了哪个集群链接以及您使用了多少 RAM?
    • @Bankelaal 我运行了大约 50K-100K 的记录,它在有序 Core 2 Duo CPU + 4 GB RAM 上运行良好。一般来说,我使用我的自定义函数手动计算所有项目之间的相互距离(注意 - 可以对其进行 numpy.vectorize 以获得巨大的性能增益),并传递结果距离矩阵以使用链接方法执行 HAC。由于已经计算了距离,因此执行 HAC 本身几乎不需要时间。
    • 谢谢,一个问题当你说 100K 文档时,这意味着需要计算 100K*100K 相似度(我们可以通过不计算对角线而只计算矩阵的上半部分来减少它),所以当你说你可以用 4G 机器做到这一点,它必须像即时计算距离一样,对吗?
    【解决方案2】:

    有各种不同的 HAC 方法,但它们通常都具有 O(n^2) 复杂度的下限。因此,虽然 50k 仍然是一个可行的数据点数量,但您无法将其扩展得太远。

    我不知道您使用的是什么代码,但您不必显式存储 N^2 大小的相似度矩阵,可以根据需要即时计算相似度值。 Scikit learn 会在不显式形成矩阵的情况下完成它。

    【讨论】:

    • 感谢您的意见,我已经检查了 JSAT。它实际上提前计算了相似度矩阵,它所做的是它不计算对角线和三角形的下部。但仍然需要提前计算相似度矩阵。在我的情况下,即使我遵循 JSAT 的方式,我的矩阵也会太大。现在我必须在一台机器上执行此操作,并且我确实有 10-15G 内存可用,但我担心时间和空间复杂性会导致问题。
    • Edward - 我意识到你是 JSAT 的作者。所以你必须确保在你的实现中你不存储相似度矩阵。而且我还看到您已经实现了自上而下和自下而上,对于 50 K 数据点如果我有 10-15G 内存,我可以为 HAC 处理 50K 资源,完成它可能需要多长时间?
    • 我犯了一个错误,JSAT 中的代码确实做了完整的矩阵,我一定一直在想一些其他的代码。不过 Scikit 不需要它
    猜你喜欢
    • 2021-04-19
    • 2018-04-10
    • 2015-07-17
    • 2023-03-12
    • 2018-04-29
    • 1970-01-01
    • 2015-12-14
    • 2013-09-17
    • 2012-09-05
    相关资源
    最近更新 更多