我想将大数据矩阵(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)
Run Code Online (Sandbox Code Playgroud)
但它已经运行了一个星期了.任何想法如何让它更快?
你真的需要5000个集群吗?k-意味着性能随着集群的数量而变化,所以你在那里拥有如此多的集群会让你自己受到很大的伤害.如果你能够减少集群的数量,那将会有很大帮助.
您确定需要所有512个尺寸吗?如果您可以修剪或组合其中一些也可能有用的尺寸.您是否尝试在数据上运行PCA?也许你可以尝试在前10个组件或类似的东西上运行k-means.
它必须是k-means吗?您可以尝试其他算法,如层次聚类或自组织映射,看看它们是否执行速度更快.我建议您采集一些数据样本(可能是N = 100K)并对其进行速度测试.
Revolution R绝对应该比基本R更快,但它仍然是R.K-means是一个非常简单的算法实现:也许尝试寻找/编写更接近金属的实现,如C/C++或FORTRAN.
你在跟踪你的内存使用情况吗?坦率地说,我怀疑你已经有吹你的记忆.在一次迭代中,您要求计算机在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实现或更强大的硬件,而是重新思考你的问题和你想要完成的事情.