运行并行 KMeans 时,“索引 N 超出轴 0 的范围,大小为 N”,而顺序 KMeans 工作正常
Posted
技术标签:
【中文标题】运行并行 KMeans 时,“索引 N 超出轴 0 的范围,大小为 N”,而顺序 KMeans 工作正常【英文标题】:"index N is out of bounds for axis 0 with size N" when running Parallel KMeans whereas sequential KMeans works fine 【发布时间】:2017-05-28 20:58:00 【问题描述】:我正在尝试使用 scikit-learn 实现并行运行 KMeans,但我不断收到以下错误消息:
Traceback (most recent call last):
File "run_kmeans.py", line 114, in <module>
kmeans = KMeans(n_clusters=2048, n_jobs=-1).fit(descriptors)
File "/usr/local/lib/python2.7/dist-packages/sklearn/cluster/k_means_.py", line 889, in fit
return_n_iter=True)
File "/usr/local/lib/python2.7/dist-packages/sklearn/cluster/k_means_.py", line 362, in k_means
for seed in seeds)
File "/usr/local/lib/python2.7/dist-packages/sklearn/externals/joblib/parallel.py", line 768, in __call__
self.retrieve()
File "/usr/local/lib/python2.7/dist-packages/sklearn/externals/joblib/parallel.py", line 719, in retrieve
raise exception
sklearn.externals.joblib.my_exceptions.JoblibIndexError: JoblibIndexError
_________________________________________________________________________
Multiprocessing exception:
..........................................................................
IndexError: index 11683 is out of bounds for axis 0 with size 11683
当我使用n_jobs=1
运行 KMeans 时,即以顺序方式运行时,我没有收到任何错误,并且一切正常。但是n_jobs=-1
我不断收到错误消息。
这是我使用的代码:
kmeans = KMeans(n_clusters=2048, n_jobs=-1).fit(descriptors)
descriptors
是一个形状为(11683, 128)
的numpy 数组。
我做错了什么还是 KMeans 实现中的错误?
我应该怎么做(例如使用BiniBatchKMeans
等)?
PS:我在具有 4 Gb RAM 和 Intel Core i7-4700HQ 2.40GHz 的 Ubuntu 16.04 64 位机器上运行它
【问题讨论】:
你能提供一个可重现的例子吗? 你的 sklearn 版本是多少? @MaxU 我的 sklearn 版本是 0.18.1。问题是我得到的错误不时出现,我不确定它是否非常可重复。我连续得到它大约 6 次,并决定问一个关于 SO 的问题。但是现在当我尝试代码时,错误停止出现。出于某种原因,在我看来更像是硬件问题...... 【参考方案1】:这个问题可以通过将输入数据转换为float64来解决,如descriptors.astype(np.float64)。
https://github.com/scikit-learn/scikit-learn/issues/8583
【讨论】:
以上是关于运行并行 KMeans 时,“索引 N 超出轴 0 的范围,大小为 N”,而顺序 KMeans 工作正常的主要内容,如果未能解决你的问题,请参考以下文章
IPython Notebook 内核在运行 Kmeans 时死机