Sklearn.KMeans:如何避免内存或值错误?

Posted

技术标签:

【中文标题】Sklearn.KMeans:如何避免内存或值错误?【英文标题】:Sklearn.KMeans : how to avoid Memory or Value Error? 【发布时间】:2017-05-28 16:45:33 【问题描述】:

我正在研究图像分类问题,并且正在创建一个词袋模型。为此,我提取了所有图像的 SIFT 描述符,并且必须使用 KMeans 算法来找到用作我的词袋的中心。

这是我拥有的数据:

图片数量:1584 SIFT 描述符数(32 个元素的向量):571685 中心数:15840

所以我运行了一个 KMeans 算法来计算我的中心:

dico = pickle.load(open('./dico.bin', 'rb')) # np.shape(dico) = (571685, 32)
k = np.size(os.listdir(img_path)) * 10 # = 1584 * 10

kmeans = KMeans(n_clusters=k, n_init=1, verbose=1).fit(dico)

pickle.dump(kmeans, open('./kmeans.bin', 'wb'))
pickle.dump(kmeans.cluster_centers_, open('./dico_reduit.bin', 'wb'))

使用此代码时,我遇到了内存错误,因为我的笔记本电脑上没有足够的内存(只有 2GB),所以我决定将中心数除以 2,并随机选择一半的 SIFT 描述符。这一次,我得到了Value Error : array is too big

如何才能在没有内存问题的情况下获得相关结果?

【问题讨论】:

显示dico的形状。 (因为我对你帖子中的数字有点困惑;但我没有使用词袋模型的经验) 我在代码中添加信息。理解词袋模型的工作原理是没有用的,它只是为了上下文。 好的。所以主要维度是样本维度(而不是特征维度)。这意味着,您可以使用一些在线 kmeans,例如 MiniBatchKMeans。在每次迭代中,只有n=batch_size 会在内存中,而不是将所有内容都读入内存。 这正是我所需要的。如果需要,您可以添加答案。 【参考方案1】:

正如@sascha 在此评论中所说,我只需要使用MiniBatchKMeans 类即可避免此问题:

dico = pickle.load(open('./dico.bin', 'rb'))

batch_size = np.size(os.listdir(img_path)) * 3
kmeans = MiniBatchKMeans(n_clusters=k, batch_size=batch_size, verbose=1).fit(dico)

pickle.dump(kmeans, open('./minibatchkmeans.bin', 'wb'))

【讨论】:

以上是关于Sklearn.KMeans:如何避免内存或值错误?的主要内容,如果未能解决你的问题,请参考以下文章

类型错误:预测()缺少 1 个必需的位置参数:sklearn KMeans 中的“X”

如何使用 Sklearn Kmeans 对稀疏数据进行聚类

sklearn KMeans 中 KMeans.cluster_centers_ 的值

使用 sklearn KMeans 与 SciPy kmeans 相比有优势吗?

python---sklearn---kmeans

Sklearn.KMeans() :获取类质心标签并引用数据集