Python 大型数据集的 kmeans 聚类

Python kmeans clustering for large datasets

我需要使用词袋(在本例中为特征袋)生成描述符向量来对 KTH video dataset 进行分类。为此,我需要使用 kmeans 聚类算法对提取的特征进行聚类并找到密码本。从数据集中提取的特征形成大约 75000 个向量,每个向量包含 100 个元素。所以我在 Ubuntu 中使用 scipy.cluster.kmeans2 实现时遇到内存问题。我运行了一些测试,发现 32000 个向量,每个向量有 100 个元素,使用的内存量约为 20GB(我的总内存为 32GB)。

是否有其他 Python kmeans 实现更高效的内存? 我已经读过 Mahout 用于大数据聚类,但我仍然不明白他的优势是什么,提到的数据量是否更节省内存?

当有很多样本时,考虑使用 sklearn's MiniBatchKMeans, which is a SGD-like method build for this case! (A more tutorial-like intro,它不会解决内存使用问题,但我希望它对于大 n_samples 会更好.当然,内存还取决于许多其他参数,如 k ... 在巨大的 n_features 的情况下,它对内存没有帮助;但这不是你的问题)

在这种情况下,您应该仔细调整您的小批量大小。

您也可以在那里尝试经典的 kmeans implementation,因为您似乎完全不符合内存要求,也许这个实现更有效(当然更可调)。

在后一种情况下,init、n_init、precompute_distances、algorithm 和 maybe copy_x 都是对内存消耗有影响的参数。

此外:如果(!)您的数据稀疏;尝试用 sparse-matrices. (from reading kmeans2-docs it seems it's not supported, but sklearn's kmeans 调用它!)