r - 大数据的kmeans

标签 r bigdata k-means

我想用 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)

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

最佳答案

  • 你真的需要5000个集群吗? k-means 性能随集群数量而变化,因此您在集群数量如此之多的情况下对自己造成了很大的伤害。如果你能坚持减少集群的数量,那将有很大帮助。
  • 您确定需要所有 512 个维度吗?如果您可以修剪或组合一些也可能有帮助的尺寸。您是否尝试过对数据运行 PCA?也许您可以尝试仅对前 10 个组件或类似的组件运行 k-means。
  • 它必须是k-means吗?您可以尝试其他算法,例如层次聚类或自组织 map ,看看它们的执行速度是否更快。我建议对您的数据进行采样(可能 N=100K),然后对其进行一些聚类算法的速度测试。
  • 革命 R 肯定应该比基础 R 快得多,但它仍然是 R。K-means 是一个非常简单的算法实现:也许尝试找到/编码一个更接近金属的实现,如 C/C++ 或 FORTRAN。
  • 您是否正在跟踪内存使用情况?坦率地说,我怀疑你已经记错了。在一次迭代中,您要求计算机在 500 万个点与 512 维的 5000 个质心之间的每个点之间构建距离矩阵。这意味着您的距离矩阵将是 5M x 5K x 512,或 1.28e13 条记录(乘以您的数据类型的位编码)。您只有 6.9e10 位 RAM。除非Revolution R正在做一些非常偷偷摸摸的事情,否则除非您购买更多RAM,否则根本不可能在您的硬件上解决这个问题。即使有 64 GB,您仍然比单个 k 均值迭代少几个数量级。
  • 您说您使用 R 是为了不增加内存使用量:也许 Revolution R 不同,但传统 R 在内存中执行所有操作,而且正如我上面所描述的,这个问题在传统硬件上并不能真正解决。您应该考虑在更强大的计算集群(如亚马逊 EC2)上租用一些时间。
  • k-means 是那些“令人尴尬地可并行化”的算法之一。如果您出租服务器空间,您可以在 hadoop 集群上运行它,这应该会有很大帮助。
  • 你想在这里完成什么? 5000 个集群很多。您的 5000 个集群的预期含义是什么?我怀疑这里真正的解决方案不是更快的 kmeans 实现或更强大的硬件,而是重新思考您的问题以及您要完成的任务。
  • 关于r - 大数据的kmeans,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18042122/

    相关文章:

    image - 使用 K 均值聚类(使用 RGB 特征)对图像进行颜色量化

    r - 在 R 中应用成本函数

    r - 我可以按列名从多列中提取值吗?

    r - 使用 regsubsets 进行 Predict()

    matlab - Matlab:基于颜色的分割

    python - k-means 使用从 minhash 生成的签名矩阵

    r - R Shiny 中的 sliderInput 出现问题 - 获取 NaN

    java - 运行maven jar文件时出错

    python - 正在创建的 CSV 文件大于我在 python/pycharm 中的原始数据的大小?

    hadoop - 如果具有相同的值,则停止 Hbase 更新操作