目前,我尝试从mlpack执行k-means聚类,mlpack是一个可伸缩的机器学习库。
但是当我在命令行执行bin/kmeans时,我总是收到错误。
error: arma::memory::acquire(): out of memory
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc输入文件的大小为7.4 GB。
你有什么建议吗?您是否知道适用于大型数据集的替代工具?
发布于 2014-09-11 23:56:58
这里没有一个真正简单的解决方案来获得确切的答案。问题是Armadillo (底层矩阵库)无法为您的输入数据分配足够的空间。
在大多数情况下,mlpack对RAM的使用比MATLAB或R等其他工具更保守,但听起来您的数据集足够大,以至于您的选择(不像Kerrek建议的那样获得具有更多RAM的系统)是有限的。
许多加速k-means的策略包括对输入数据集进行采样并在输入点的子集上运行k-means。因为k-means算法对给定的初始质心非常敏感,所以这种采样策略经常被用来选择初始质心。参见Bradley和Fayyad,1998:ftp://www.ece.lsu.edu/pub/aravena/ee7000FDI/Presentations/Clustering-Pallavi/Ref4_k-means.pdf
在您的情况下,只对可以加载到RAM中的数据子集运行k-means,并将这些数据作为集群质心,可能会更容易,也足够准确。如果k相当小,而数据集中的点的数量很大(也就是说,集群的数量比点的数量小得多),那么这应该是一种合理的方法,当然也是一种比使用RAM修改mlpack代码更保守或编写自己的程序使用mmap()或其他方法更简单的方法,而且比购买新的RAM更便宜。
https://stackoverflow.com/questions/25695312
复制相似问题