我有大约50K的数据集,其值可以在0到10之间。我想应用HAC来聚类这些数据。但是要应用HAC,我需要准备N * N相似度矩阵。
对于N = 50 K,这个矩阵太大而无法保留在内存中,即使我使用短。
有没有办法分批进行HAC或任何其他方法可以帮助我应用具有50K数据点的HAC。我计划在java中实现它。
我也担心会花费一些时间,任何关于此的指示都会非常有帮助。
答案 0 :(得分:2)
如果您想应用自上而下的群集方法,可以轻松分发它,相关文章:http://scgroup.hpclab.ceid.upatras.gr/faculty/stratis/Papers/tm07book.pdf
长话短说(引自其他文章):在第一个节点拆分后,创建的每个节点都可以运送到分布式进程再次拆分等等......每个分布式进程只需知道子集它正在拆分的数据集。只有父进程知道完整数据集。
自下而上的方法更难以分发,我不会尝试在这里提出任何建议。
但是,嘿,你不需要自己用Java编写,Mahout或MLLib库已经拥有它,并且它们支持java。和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.
答案 1 :(得分:1)
有各种不同的HAC方法,但它们通常都受到O(n ^ 2)复杂性的限制。因此,尽管50k仍然是一个可行数量的数据点,但您将无法将其扩展到太远。
我不知道你正在使用什么代码,但你不必明确存储N ^ 2大小的相似性矩阵,可以根据需要动态计算相似性值。 Scikit学习将在没有明确形成矩阵的情况下完成。