3

我想用 kmeans 将大数据矩阵(500 万 X 512)聚类到 5000 个中心。我使用 R 是为了不让这个矩阵破坏我的记忆。

我编写了这段代码来将 txt 矩阵转换为 xdf 然后聚类:

rxTextToXdf(inFile = inFile, outFile = outFile)
vars <- rxGetInfo(outFile,getVarInfo=TRUE)
myformula <- as.formula(paste("~", paste(names(vars$varInfo), collapse = "+"), sep=""))

clust <- rxKmeans(formula = myformula, data = outFile,numClusters = 5000, algorithm =     "lloyd", overwrite = TRUE)
write.table(clust$centers, file = centersFiletxt, sep=",", row.names=FALSE,    col.names=FALSE)

但它已经运行了一周。任何想法如何使它更快?

4

3 回答 3

9
  1. 你真的需要 5000 个集群吗?k-means 的性能随集群的数量而变化,因此那里的集群数量如此之多,对自己造成了很大的伤害。如果你能忍受减少集群的数量,那将有很大帮助。

  2. 您确定需要所有 512 维度吗?如果您可以修剪或组合其中一些也可能有所帮助的尺寸。您是否尝试过在数据上运行 PCA?也许您可以尝试仅在前 10 个组件上运行 k-means 或类似的东西。

  3. 它必须是k-means吗?您可以尝试其他算法,例如层次聚类或自组织地图,看看它们是否执行得更快。我建议对您的数据进行抽样(可能 N=100K)并在此基础上快速测试一些聚类算法。

  4. Revolution R 绝对应该比基本 R 快得多,但它仍然是 R。K-means 是一个非常简单的算法实现:也许尝试找到/编码一个更接近金属的实现,比如 C/C++ 或 FORTRAN。

  5. 您是否正在跟踪您的内存使用情况?坦率地说,我怀疑你已经了你的记忆。在一次迭代中,您要求您的计算机在 500 万个点中的每个点与512 个维度中的 5000 个质心中的每个点之间建立一个距离矩阵。这意味着您的距离矩阵将是 5M x 5K x 512 或 1.28e13 条记录(乘以您的数据类型的位编码)。您只有 6.9e10 位 RAM。除非Revolution R 正在做一些非常偷偷摸摸的事情,否则根本不可能在硬件上解决这个问题,除非你购买更多的内存。即使有 64 GB,您仍然比单个 k-means 迭代少几个数量级。

  6. 你说你使用 R 是为了不破坏你的内存使用:也许革命 R 是不同的,但是传统的 R 在内存中做所有事情,正如我上面所描述的,这个问题在传统硬件上并不容易解决。您应该考虑在更强大的计算集群(如亚马逊 EC2)上租用一些时间。

  7. k-means 是那些“令人尴尬的可并行化”算法之一。如果你租用服务器空间,你可以在 hadoop 集群上运行它,这应该会有很大帮助。

  8. 你想在这里完成什么?5000 个集群很多。您的 5000 个集群的预期含义是什么?我怀疑这里真正的解决方案不是更快的 kmeans 实现或更强大的硬件,而是重新考虑您的问题以及您要完成的工作。

于 2013-08-04T14:36:47.933 回答
5

如果您购买了 RevoR,您还需要支付支持费用。为什么不问他们?

于 2013-08-05T17:29:33.683 回答
0

如果您可以创建一个样本来表示您的数据,您可以先对样本进行聚类,然后使用分类技术在其上训练模型,然后预测剩余数据的块以分配聚类。

训练模型还将告诉您哪些变量不重要,您可以通过这种方式降低维度。

当您可以通过解决问题获得更多见解时,为什么要增加 5m 行 x 512 个特征 x 5000 个集群的计算复杂度?

于 2016-02-05T00:09:42.373 回答