2017-08-10 2 views
0

Ich bin neu in Agglomerative Clustering und doc2vec, so hoffe ich, jemand kann mir mit dem folgenden Problem helfen.Agglomeration Clustering zu doc2vec

Dies ist mein Code:

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) 

Was ich will, ist der Mittelwert der Abstände von jeder Beobachtung prognostizieren. Ich habe folgende Fehlermeldung:

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: 

Antwort

1

Sie erhalten eine MemoryError. Dies ist ein zuverlässiger Indikator dafür, dass in der angegebenen Zeile kein Speicher mehr zur Verfügung steht.

Die Zeile zeigt an, dass versucht wurde, ein np.zeros() Array mit (m * (m - 1)) // 2 Werten vom Typ double (8 Byte) zuzuweisen. Betrachtet man die scipy Quelle, m, ist hier die Anzahl der Vektoren in X, aka model_dm.docvecs.doctag_syn0.shape[0].

Also, mit wie vielen Dokumenten arbeiten Sie? Wenn es 200.000 ist, müssen Sie ...

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

... oder über 320 GB RAM für die np.zeros() Zuweisung erfolgreich zu sein. (Wenn Sie mehr docvecs haben, noch mehr RAM.)

(Agglomerative Clustering alle paarweise Abstände wissen muss, was die scipy Implementierung versucht, am Anfang zu berechnen und zu speichern, die sehr platzraubend.)

Möglicherweise benötigen Sie mehr Arbeitsspeicher oder weniger Docvecs oder einen anderen Clusteralgorithmus oder verwenden eine Implementierung, die beim Berechnen von Entfernungen viel langsamer ist (aber viel langsamer ist, weil sie oft neu berechnet und nicht wiederverwendet wird). Entfernungen, die es wiederholt benötigt.