我编写了一个Java代码来聚类一个巨大的数据集,该数据集有大约100000个x100000个列(稀疏行)。但是数据集是使用稀疏实例创建的,因此它具有稀疏矩阵的结构。
我可以在我的代码中使用3个聚类函数:
JavaML:Kmeans,Weka:SimpleKmeans,Weka:Xmeans
我已经运行了Weka的SimpleKmeans功能,但是它工作了大约9个小时并且群集过程还没有结束。这些函数的估计运行时间是多少,哪一个最适合这个数据集?
答案 0 :(得分:1)
K-means 不适合稀疏数据。
原因是平均值不会稀疏,因此,数据集的平均值异常。更糟糕的是:平均值之间的距离可能小于从实例到平均值的距离。
在某些时候你会得到一些结果 - Weka非常缓慢,你可能想要更快地寻找东西;对于这个数据集大小,你可能想要分配给Mahout(但从这里的问题来看,还有其他问题)。 IIRC还通过预计算欧氏长度来加速稀疏矢量的加速技巧 - 但是,结果可能没有意义。
问题是K-means寻找最佳的Voronoi单元分区。但是,当稀疏时,您的数据集可能不具有自然的Voronoi单元结构。因此,您需要花费大量时间来找到数据无法拥有的最佳结构。