我想将大数据矩阵(500万X 512)与kmeans聚类到5000个中心。 我正在使用R,以免用这个矩阵来消磨我的记忆。
我编写了这段代码,将txt矩阵转换为xdf,然后转换为cluster:
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 :(得分:8)
你真的需要5000个集群吗? k-意味着性能随着集群的数量而变化,所以你在那里拥有如此多的集群会让你自己受到很大的伤害。如果你能够减少集群数量,那将会有很大帮助。
您确定需要所有512个尺寸吗?如果您可以修剪或组合其中一些也可能有用的尺寸。您是否尝试在数据上运行PCA?也许你可以尝试在前10个组件或类似的东西上运行k-means。
是否必须是k-means?您可以尝试其他算法,如层次聚类或自组织映射,看看它们是否执行速度更快。我建议您采集一些数据样本(可能是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-means迭代短几个数量级。
你说你正在使用R以免浪费你的内存使用:也许Revolution R是不同的,但是传统的R在内存中所有,如上所述,这个在传统硬件上问题实际上并不容易处理。您应该考虑在像亚马逊EC2这样功能更强大的计算集群上租一些时间。
k-means是那些“令人难以理解的兼容性”算法之一。如果您租用服务器空间,可以在hadoop集群上运行它,这应该会有很大帮助。
你想在这里完成什么? 5000个集群很多。 5000个集群的预期含义是什么?我怀疑这里的真正解决方案不是更快的kmeans实现或更强大的硬件,而是重新思考你的问题以及你想要实现的目标。
答案 1 :(得分:5)
如果您购买了RevoR,您还需要支付费用。为什么不问他们?
答案 2 :(得分:0)
如果您可以创建样本来表示数据,则可以先对样本进行聚类,然后使用分类技术在其上训练模型,然后预测剩余数据的块以分配聚类。
训练模型还会告诉您哪些变量不重要,您可以通过这种方式减少维数。
为什么在5米行x 512个特征x 5000群集中增加计算复杂度时,你可以通过处理问题来获得更多的见解?