2013-08-04 52 views
3

我想用kmeans将大数据矩阵(500万x 512)聚类到5000个中心。 我正在使用R为了不使用这个矩阵来打击我的记忆。kmeans with big data

我写了这个代码为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) 

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

+0

看起来像是使用Revolution R而不是开源R.难以重现。计算机的规格是什么? – dickoa

+0

英特尔i7 3630 2.4GHz 8 GB内存500 Gb硬盘窗口x64 – RamBracha

+0

我不使用Revolution,唯一的建议是我可以尝试'bigmemory' +'biganalytics :: bigkmeans',但就我所知它不在Windows上工作(除非有人纠正我),所以如果你有机会访问其他机器...... – dickoa

回答

7
  1. 你真的需要5000簇吗? k-means性能随着簇的数量而变化,所以你在那里聚集了大量的簇会让你自己受到很大的伤害。如果你能够减少群集的数量,那将会有很大的帮助。

  2. 您确定您需要全部512个尺寸?如果您可以修剪或合并一些可能有用的尺寸。你有没有试过在你的数据上运行PCA?也许你可以尝试在前10个组件上运行k-means或类似的东西。

  3. 是否必须是k-means?您可以尝试其他算法,如层次聚类或自组织映射,看看这些算法执行速度是否更快。我建议以您的数据为例(可能N = 100K),然后根据测试速度测试一些聚类算法。 K-means是一个非常简单的实现算法:可能试着找到一个实现或者编码一个更接近金属的实现,比如C/C++或FORTRAN。

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

  5. 你说你是为了使用R键不吹你的内存使用情况:也许革命R是不同的,但现有的R确实一切在内存中,如我上述的,这个问题是不是真的在传统硬件上容易处理。您应该考虑租用一些更强大的计算群集,如亚马逊EC2。

  6. k-means是其中一种算法,它是“难以理解的可对齐的”。如果你租用服务器空间,你可以在hadoop集群上运行它,这应该会有很大的帮助。

  7. 你想在这里完成什么? 5000簇很多。 5000个集群的预期含义是什么?我怀疑这里的真正解决方案不是更快的kmeans实现或更强大的硬件,而是反思你的问题以及你正在努力完成的任务。

+0

R中有像rxkmeans这样的函数,用于从硬盘上的文件写入和加载数据,这样我就可以绕过内存问题。我有500 Gb的硬盘驱动器,这对计算来说已经足够了。问题在于运行时间。我不想等待一个月的计算。 – RamBracha

+0

您是否确认过您的outfile(或其他R正用于将这些计算推送到磁盘的数据库)是否已填充并继续进行修改?我忍不住怀疑R被冻结。是否有一个输出日志文件可以引用来确认这实际上仍然在挤出并且不会停留在第一次迭代上? –

+3

项目#8是该地段最重要的问题,与#1有关。如果您研究一些像AIC或BIC这样的指标,您可能会发现在5或10个集群之后,您不会为解决方案的质量添加任何内容。除非你有数据的系统真的有5000个离散状态,否则你可能只是推动电子而没有真正的好处。 –

4

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

0

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

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

为什么增加5m行x 512个特征x 5000个簇的计算复杂度,当您通过处理这个问题可以得到更多的见解时?