Python内存错误,用于scikit-learn中的kmeans



我正在运行这个 选择聚类数 scikit-learnpython 中举例说明。 该示例获取具有 2 个特征的多个样本,并找到用于kmeans聚类分析的最佳 k。

就我而言,我有具有 3 个特征的示例。 他们确实3 dimensional coordinates。 因此,在代码中,我只需将输入更改为我的样本,其余部分保持不变。 我的样本点数量非常大,可能超过 10,000 点。

当我输入所有数据时,出现内存错误(我有 16GB 的 RAM,并且全部已满)。但是当我输入一半的数据时,它不会给出错误。虽然 ipython 笔记本显示的轮廓功能错误,但我很确定它发生在 kmeans 中,它不执行聚类并突然跳转到此错误。

使用相同数量的数据,我在C++中进行了kmeans聚类,它完全没问题,而且速度很快。有什么想法可以解决这个问题吗?这是我得到的错误

         MemoryError              Traceback (most recent call last)
        <ipython-input-4-ed4b060ccea1> in <module>()
 41     # This gives a perspective into the density and separation of the formed
 42     # clusters
---> 43     silhouette_avg = silhouette_score(X, cluster_labels)
 44     print("For n_clusters =", n_clusters,
 45           "The average silhouette_score is :", silhouette_avg)
/usr/lib64/python2.7/site-packages/sklearn/metrics/cluster/unsupervised.pyc in silhouette_score(X, labels, metric, sample_size, random_state, **kwds)
 82         else:
 83             X, labels = X[indices], labels[indices]
---> 84     return np.mean(silhouette_samples(X, labels, metric=metric, **kwds))
 85 
 86 
  /usr/lib64/python2.7/site-packages/sklearn/metrics/cluster/unsupervised.pyc in silhouette_samples(X, labels, metric, **kwds)
141 
142     """
 --> 143     distances = pairwise_distances(X, metric=metric, **kwds)
144     n = labels.shape[0]
145     A = np.array([_intra_cluster_distance(distances[i], labels, i)
 /usr/lib64/python2.7/site-packages/sklearn/metrics/pairwise.pyc in pairwise_distances(X, Y, metric, n_jobs, **kwds)
649         func = pairwise_distance_functions[metric]
650         if n_jobs == 1:
--> 651             return func(X, Y, **kwds)
652         else:
653             return _parallel_pairwise(X, Y, func, n_jobs, **kwds)
 /usr/lib64/python2.7/site-packages/sklearn/metrics/pairwise.pyc in euclidean_distances(X, Y, Y_norm_squared, squared)
181         distances.flat[::distances.shape[0] + 1] = 0.0
182 
--> 183     return distances if squared else np.sqrt(distances)
184 
185 
MemoryError: 

内存不足的不是 k 均值。

但是轮廓评估指数需要二次距离计算,显然sklearn试图通过计算距离矩阵来做到这一点。最有可能的是,它甚至需要它的多个副本。

现在,自己做数学。大多数实现在尝试计算全距离矩阵时会在大约 64k 个实例时耗尽内存。

因此,删除对轮廓的调用。

相关内容

  • 没有找到相关文章