【问题标题】:python memory error for kmeans in scikit-learnscikit-learn中kmeans的python内存错误
【发布时间】:2016-06-28 16:11:08
【问题描述】:

我在python 中运行scikit-learnSelecting the number of clusters 示例。该示例获取了几个具有 2 个特征的样本,并为 kmeans 聚类找到了最佳 k。

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

当我输入所有数据时,我遇到了内存错误(我有 16GB 的 RAM,并且所有这些都已满)。但是当我输入一半的数据时,它并没有给出错误。尽管 ipython notebook 显示了剪影函数的错误,但我很确定它发生在 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: 

【问题讨论】:

  • 如何输入数据?也许它可以懒惰地生成。
  • like this mypath =/Desktop/trainingFiles/' onlyfiles = [f for f in listdir(mypath) if isfile(join(mypath, f))] results_trajectories = [] for i in range(6 ,len(onlyfiles)): fname = onlyfiles[i] filepath = mypath + fname f = open(filepath, 'r') t = f.read().split('\n') for line in t: if line : ll = [float(x) for x in line.split(',')] 结果_trajectories.append(ll) all_Trajectories = np.array(resulted_trajectories) print(all_Trajectories) X = all_Trajectories range_n_clusters = [4, 5, 6, 7、8、9、10]
  • 然后我使用 X 作为输入

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


【解决方案1】:

不是 k-means 内存不足。

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

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

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

【讨论】:

  • 是的,你是对的,问题不在于 kmeans,因为当我删除 sillouette 部分时它可以工作。解决办法是什么 ?无论如何,我需要 sillouette,我有大约 10000 个实例,每个实例都有 3 个功能。有什么想法吗?
  • 自己实现剪影,尽量节省内存。 10000 可以使用 400MB 的 RAM。
  • 现在我看到它的大小约为 60,000 个 3D 实例,有一个参数 sample size 使 sillouette 使用所有实例的样本来计算距离矩阵。您认为对于这种数据量来说,多少样本量就足够了?
  • 60k 仍然是可行的,10GB 的 RAM 是一个很好的实现。我不能推荐样本大小或剪影 - 我不使用这种启发式,它经常误导恕我直言。永远不要相信“质量”数字。
猜你喜欢
  • 2019-11-29
  • 2014-05-31
  • 2018-02-15
  • 1970-01-01
  • 1970-01-01
  • 2014-05-11
  • 2015-02-20
  • 2012-06-27
  • 2015-03-21
相关资源
最近更新 更多