繁体   English   中英

ValueError:超出最大允许尺寸,AgglomerativeClustering fit_predict

[英]ValueError: Maximum allowed dimension exceeded, AgglomerativeClustering fit_predict

我正在尝试将分层聚类适合于100.000个对象的23维数据集。 如何解决跟随误差?

>>>ac = AgglomerativeClustering(n_clusters=2, affinity='euclidean', linkage='complete')
>>>k=hf.features_itter(hf.file)
>>>k


array([[49,  0,  3, ...,  0,  0,  3],
       [39,  1,  4, ...,  0,  0,  3],
       [25,  0,  3, ...,  0,  0,  1],
       ...,
       [21,  0,  6, ...,  0,  0,  1],
       [47,  0,  8, ...,  0,  0,  2],
       [28,  1,  2, ...,  0,  1,  3]], dtype=uint8)

>>>res = ac.fit_predict(k)

Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    hierarchical()
  File "C:\Users\Tolis\Downloads\WPy-3670\notebooks\ergasia\clustering.py", line 39, in hierarchical
    ac.fit_predict(k)
  File "C:\Users\Tolis\Downloads\WPy-3670\python-3.6.7\lib\site-packages\sklearn\base.py", line 355, in fit_predict
    self.fit(X)
  File "C:\Users\Tolis\Downloads\WPy-3670\python-3.6.7\lib\site-packages\sklearn\cluster\hierarchical.py", line 830, in fit
    **kwargs)
  File "C:\Users\Tolis\Downloads\WPy-3670\python-3.6.7\lib\site-packages\sklearn\externals\joblib\memory.py", line 329, in __call__
    return self.func(*args, **kwargs)
  File "C:\Users\Tolis\Downloads\WPy-3670\python-3.6.7\lib\site-packages\sklearn\cluster\hierarchical.py", line 584, in _complete_linkage
    return linkage_tree(*args, **kwargs)
  File "C:\Users\Tolis\Downloads\WPy-3670\python-3.6.7\lib\site-packages\sklearn\cluster\hierarchical.py", line 470, in linkage_tree
    out = hierarchy.linkage(X, method=linkage, metric=affinity)
  File "C:\Users\Tolis\Downloads\WPy-3670\python-3.6.7\lib\site-packages\scipy\cluster\hierarchy.py", line 708, in linkage
    y = distance.pdist(y, metric)
  File "C:\Users\Tolis\Downloads\WPy-3670\python-3.6.7\lib\site-packages\scipy\spatial\distance.py", line 1877, in pdist
    dm = np.empty((m * (m - 1)) // 2, dtype=np.double)
ValueError: Maximum allowed dimension exceeded

ValueError:超出最大允许尺寸

我猜-由于此算法的某些特性,因此无法使用聚集聚类解决此问题。 您可以在函数中测量所有对象对之间的距离

y = distance.pdist(y, metric)

AgglomerativeClustering内部调用。

因此, AgglomerativeClustering算法不适用于大型甚至中型数据集:

分层聚集聚类(HAC)的标准算法的时间复杂度为O(n ^ 3),并且需要O(n ^ 2)内存,这对于中等数据集来说也太慢了。

-因为速度很慢,而且内存为O(n^2) 即使算法以最佳方式使用RAM,成对距离的矩阵也会消耗〜1e10 1e10 * 4个字节(〜40Gb)的内存-因为每个float32值都会消耗4个字节,因此有10.000 * 10.000个此类度量。 可能没有足够的内存。

(我已经使用〜100Gb RAM测试了100.000个随机点的成对距离,并且计算的时间很长-尽管没有失败)

而且,它将运行很长时间-因为它的时间复杂度为O(n^3)

我建议您尝试sklearn.cluster.DBSCAN它对某些数据具有类似的行为( sklearn示例 ),而且,它以更快的方式运行并且消耗的内存更少:

DBSCAN-带有噪声的应用程序的基于密度的空间聚类。 查找高密度的核心样本并从中扩展聚类。 适用于包含相似密度簇的数据。

内存消耗:

此实现批量计算所有邻居查询,这将内存复杂度提高到O(nd),其中d是邻居的平均数量,而原始DBSCAN的内存复杂度为O(n)。 在查询这些最近邻域时,它可能会吸引更高的内存复杂度,具体取决于算法

时间复杂度:平均O(n log n) ,但取决于实现方式,最坏情况为O(n^2) -一种比O(n^3)更好的凝聚方式。

检查此聚类算法,可能会给出不错的结果。 主要问题是DBSCAN会自动定义集群数,因此您不能将其设置为2。

谢谢答案! 我必须使用分层聚类,因为这是研究的案例,所以我遵循链接中描述的解决方案

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM