运行并行 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 工作正常的主要内容,如果未能解决你的问题,请参考以下文章

均值||用于 Spark 的情感分析

借助 GPU 支持对高维数据进行更快的 Kmeans 聚类

IPython Notebook 内核在运行 Kmeans 时死机

运行 Kmeans 时如何解决“异常:数据必须是一维”错误

为啥在 Google Colab 中重新启动运行时后 KMeans 的 silhouette_score 会发生变化?

在运行 spark mllib kmeans 时,网站上每个阶段的作用是啥?