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 中 KMeans.cluster_centers_ 的值