2017-02-15 6 views
0

Hier ist mein Code:hierarchische Clustern in scipy - Speicherfehler

import numpy as np 
from scipy.cluster.hierarchy import fclusterdata 

def mydist(p1,p2): 
    return 1 

Y = np.random.randn(100000,2) 
fclust1 = fclusterdata(Y, 1.0, metric=mydist) 

Es erzeugt die folgenden Fehler:

MemoryError        Traceback (most recent call last) 
<ipython-input-52-818db8791e96> in <module>() 
----> 1 fclust1 = fclusterdata(Y, 1.0, metric=mydist) 

C:\Anaconda3\lib\site-packages\scipy\cluster\hierarchy.py in fclusterdata(X, t, criterion, metric, depth, method, R) 
    1682       'array.') 
    1683 
-> 1684  Y = distance.pdist(X, metric=metric) 
    1685  Z = linkage(Y, method=method) 
    1686  if R is None: 

C:\Anaconda3\lib\site-packages\scipy\spatial\distance.py in pdist(X, metric, p, w, V, VI) 
    1218 
    1219  m, n = s 
-> 1220  dm = np.zeros((m * (m - 1)) // 2, dtype=np.double) 
    1221 
    1222  wmink_names = ['wminkowski', 'wmi', 'wm', 'wpnorm'] 

MemoryError: 

Also ich meinen Vektor bin zu raten, ist zu groß. Ich bin etwas überrascht, da meine Distanzfunktion trivial ist. Was ist der maximale Größenvektor, den fclusterdata akzeptieren kann?

Antwort

1

Hierarchisches Clustering erfordert normalerweise eine paarweise Abstandsmatrix.

Das bedeutet, dass Sie O (n^2) Speicher benötigen. Und es "sieht" nicht, dass Ihre Distanz konstant ist (und es macht auch keinen Sinn, dafür zu optimieren).

Es ist kein sehr skalierbarer Algorithmus.

+0

So zerbricht es, wenn es versucht, Speicher vorab zu reservieren, da es nicht viel zu speichern gibt. – user1700890

+2

Ja. Sie haben keinen Speicher mehr. Berechnen Sie selbst 'm * (m - 1) // 2 * 8'. –