0

我是 Agglomerative Clustering 和 doc2vec 的新手,所以我希望有人可以帮助我解决以下问题。

这是我的代码:

model = AgglomerativeClustering(linkage='average',
        connectivity=None, n_clusters=2)
X = model_dm.docvecs.doctag_syn0
model.fit(X, y=None)
model.fit_predict(X, y=None)

我想要的是预测每个观察的距离的平均值。我收到以下错误:

MemoryErrorTraceback (most recent call last)
<ipython-input-22-d8b93bc6abe1> in <module>()
      2 model = AgglomerativeClustering(linkage='average',connectivity=None,n_clusters=2)
      3 X = model_dm.docvecs.doctag_syn0
----> 4 model.fit(X, y=None)
      5 

/usr/local/lib64/python2.7/site-packages/sklearn/cluster/hierarchical.pyc in fit(self, X, y)
    763 n_components=self.n_components,
    764                                        n_clusters=n_clusters,
--> 765                                        **kwargs)
    766         # Cut the tree
    767         if compute_full_tree:

/usr/local/lib64/python2.7/site-packages/sklearn/externals/joblib/memory.pyc in __call__(self, *args, **kwargs)
    281 
    282     def __call__(self, *args, **kwargs):
--> 283         return self.func(*args, **kwargs)
    284 
    285     def call_and_shelve(self, *args, **kwargs):

/usr/local/lib64/python2.7/site-packages/sklearn/cluster/hierarchical.pyc in _average_linkage(*args, **kwargs)
    547 def _average_linkage(*args, **kwargs):
    548     kwargs['linkage'] = 'average'
--> 549     return linkage_tree(*args, **kwargs)
    550 
    551 

/usr/local/lib64/python2.7/site-packages/sklearn/cluster/hierarchical.pyc in linkage_tree(X, connectivity, n_components, n_clusters, linkage, affinity, return_distance)
    428             i, j = np.triu_indices(X.shape[0], k=1)
    429             X = X[i, j]
--> 430         out = hierarchy.linkage(X, method=linkage, metric=affinity)
    431         children_ = out[:, :2].astype(np.int)
    432 

/usr/local/lib64/python2.7/site-packages/scipy/cluster/hierarchy.pyc in linkage(y, method, metric)
    669                          'matrix looks suspiciously like an uncondensed '
    670                          'distance matrix')
--> 671         y = distance.pdist(y, metric)
    672     else:
    673         raise ValueError("`y` must be 1 or 2 dimensional.")

/usr/local/lib64/python2.7/site-packages/scipy/spatial/distance.pyc in pdist(X, metric, p, w, V, VI)
   1375 
   1376     m, n = s
-> 1377     dm = np.zeros((m * (m - 1)) // 2, dtype=np.double)
   1378 
   1379     # validate input for multi-args metrics

MemoryError: 
4

1 回答 1

1

你得到一个MemoryError. 这是一个可靠的指标,表明您内存不足,在指示的行上。

该行表示尝试分配类型值(8 个字节)的np.zeros()数组。查看源,这里是 中的向量数量,也就是。(m * (m - 1)) // 2doublescipymXmodel_dm.docvecs.doctag_syn0.shape[0]

那么,您正在使用多少个 docvecs?如果是200,000,您将需要...

((200000 * 199999) // 2) * 8 bytes

...或大约 320GB 的 RAMnp.zeros()才能成功分配。(如果你有更多的 docvecs,甚至更多的 RAM。)

(凝聚聚类需要知道所有的成对距离,scipy 实现一开始就试图计算和存储,这非常耗费空间。)

您可能需要更多的 RAM,或者使用更少的 docvecs,或者使用不同的聚类算法,或者使用更懒惰的计算距离的实现(但是会慢得多,因为它通常会重新计算而不是重用距离它需要反复。

于 2017-08-11T04:38:46.420 回答