2017-02-15 4 views
0

は私のコードです:階層的クラスタリング - ここでメモリエラー

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) 

それは次のエラー生成:

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: 

だから私は私のベクトルを推測していますが大きすぎます。私の距離機能は些細なので、少し驚いています。 fclusterdataが受け入れることができる最大サイズのベクトルは何ですか?

答えて

1

階層的クラスタリングでは、通常、の対の距離行列が必要です。

つまり、O(n^2)のメモリが必要です。そして、あなたの距離が一定であることを「認識」しません(そして、これを最適化することも意味がありません)。

非常にスケーラブルなアルゴリズムではありません。

+0

これは、メモリをあらかじめ割り当てようとすると破損します。格納するメモリがあまりないためです。 – user1700890

+2

はい。あなたは記憶がなくなってしまいます。 'm *(m - 1)// 2 * 8'を自分で計算する。 –

関連する問題