使用 scipy.cluster.hierarchy 中的链接函数

usage of linkage function from scipy.cluster.hierarchy

我正在尝试将层次聚类应用于图像的像素值。这是分配图像的不同区域并提取具有相似颜色的片段。问题区域是仅按接近颜色分割图像, 而不是 按形状。 我正在尝试(假设图像被加载为 numpy 形状数组(256,256,3),由于版权问题无法共享图片:

from scipy.cluster.hierarchy import dendrogram, linkage
ppp=img.reshape(img.shape[0]*img.shape[1],img.shape[2])
Z = linkage(ppp, method = 'ward')
dendrogram(Z,leaf_rotation=90.,    leaf_font_size=8.,)

这是错误:

MemoryError                               Traceback (most recent call last)
<ipython-input-87-39453b2f2da1> in <module>()
     14     ppp=img.reshape(img.shape[0]*img.shape[1],img.shape[2])
---> 15     Z = linkage(ppp, method = 'ward')
     16     dendrogram(Z,leaf_rotation=90.,    leaf_font_size=8.,)

~\AppData\Local\Continuum\anaconda3\lib\site-packages\scipy\cluster\hierarchy.py in linkage(y, method, metric, optimal_ordering)
    706                          'matrix looks suspiciously like an uncondensed '
    707                          'distance matrix')
--> 708         y = distance.pdist(y, metric)
    709     else:
    710         raise ValueError("`y` must be 1 or 2 dimensional.")

~\AppData\Local\Continuum\anaconda3\lib\site-packages\scipy\spatial\distance.py in pdist(X, metric, *args, **kwargs)
   1650     out = kwargs.pop("out", None)
   1651     if out is None:
-> 1652         dm = np.empty((m * (m - 1)) // 2, dtype=np.double)
   1653     else:
   1654         if out.shape != (m * (m - 1) // 2,):

你能帮忙吗?

ppp 具有形状 (65536, 3),因此该错误消息中的 m 是 65536。在内部,linkage 创建一个大小为 [=13 的浮点值数组=] 来保存所有的成对距离。在您的情况下,这是 2147450880 个元素。每个浮点元素需要八个字节,因此数组的总大小为 17179607040 字节。超过 17 GB。想必你没有足够的内存来分配这样的数组。