【问题标题】:hierarchical clustering in scipy - memory errorscipy中的层次聚类 - 内存错误
【发布时间】:2017-07-04 10:36:42
【问题描述】:

这是我的代码:

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可以接受的最大向量是多少?

【问题讨论】:

    标签: python scipy cluster-analysis


    【解决方案1】:

    层次聚类通常需要一个成对距离矩阵

    这意味着您需要 O(n^2) 内存。而且它不会“看到”您的距离是恒定的(为此进行优化也没有意义)。

    这不是一个非常可扩展的算法。

    【讨论】:

    • 所以它在尝试预分配内存时崩溃了,因为没有太多要存储的东西。
    • 是的。你的内存用完了。自己计算m * (m - 1) // 2 * 8
    猜你喜欢
    • 1970-01-01
    • 2018-12-10
    • 2021-07-02
    • 1970-01-01
    • 2011-02-23
    • 2012-04-10
    • 2019-04-27
    • 2021-01-15
    • 2014-12-23
    相关资源
    最近更新 更多