我需要使用词袋(在这种情况下是一组特征)来生成描述符向量以对KTH video dataset进行分类。为了做到这一点,我需要使用kmeans聚类算法来聚类提取的特征并找到码本。从数据集中提取的特征形成大约75000个向量,每个向量为100个元素。所以我在Ubuntu中使用scipy.cluster.kmeans2实现面临内存问题。我破坏了一些测试并发现使用32000向量,每个有100个元素,使用的内存量大约为20GB(我的总内存为32GB)。
还有其他Python kmeans实现更高效的内存吗? 我已经阅读了关于聚类大数据的Mahout,但我仍然不明白他的优势是什么,是否提高了内存效率?
答案 0 :(得分:1)
当有很多样本时,请考虑使用sklearn's MiniBatchKMeans,这是一种类似SGD的方法构建! (更像教程的intro没有解决内存使用问题,但我希望它对于大型 n_samples 更好。当然,内存也取决于许多其他参数,如k。 ..对于巨大的 n_features ,它对内存没有帮助;但这不是你的问题)
在这种情况下,您应该仔细调整您的小批量大小。
您也可以在那里尝试经典kmeans implementation,因为您似乎完全没有内存要求,也许这种实现效率更高(肯定更可调)。
在后一种情况下,init,n_init,precompute_distances,algorithm和maybe copy_x都是对内存消耗有影响的参数。
此外:如果(!)您的数据稀疏;尝试用sparse-matrices调用它。 (从阅读kmeans2-docs看来它似乎不受支持,但sklearn的kmeans确实支持!)