scikit-learn中的kmeans的python内存错误

时间:2016-03-13 17:56:29

标签: python c++ scikit-learn k-means

我在scikit-learn中运行python kmeans的{​​{1}}示例。该示例获取具有2个要素的多个样本,并找到3 dimensional coordinates聚类的最佳k。

在我的情况下,我有3个功能的样本。他们确实是C++。所以,在代码中我只是将输入更改为我的样本,其余的保持不变。我的样本点数非常大,可能超过10,000点。

当我输入所有数据时,我得到了内存错误(我有16GB的RAM并且所有数据都已满)。但是,当我放入一半的数据时,它不会给出错误。虽然错误显示ipython笔记本的剪影功能,但我很确定它发生在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: 中进行了kmeans聚类,并且完全没有任何问题。 有什么想法我怎么解决这个问题? 这是我得到的错误

var responses = [];
for( var i=0; i < Number(process.argv[2]); i++) {
    responses.push(function () {
        var index = i;
        function bar() {
            console.log(index);
        }
        return bar;
    }());
}

responses.forEach(function(d){
    d();
});

1 个答案:

答案 0 :(得分:0)

k-means耗尽内存。

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

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

因此,删除对剪影的调用。