【问题标题】:ValueError: Maximum allowed dimension exceeded, AgglomerativeClustering fit_predictValueError:超出最大允许尺寸,AgglomerativeClustering fit_predict
【发布时间】:2019-02-07 16:59:25
【问题描述】:

我正在尝试在包含 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: 超出最大允许尺寸

【问题讨论】:

    标签: python scikit-learn hierarchical-clustering


    【解决方案1】:

    我猜 - 由于该算法的某些属性,使用凝聚聚类无法优雅地解决此问题。您在使用函数时测量所有对象对之间的距离

    y = distance.pdist(y, metric)
    

    AgglomerativeClustering 内部调用。

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

    层次凝聚聚类 (HAC) 的标准算法的时间复杂度为 O(n^3),并且需要 O(n^2) 内存,这使得即使是中等数据集也太慢了。

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

    (我已经用 ~100Gb RAM 测试了 100.000 个随机点的成对距离,它的计算时间太长了 - 虽然没有失败)

    此外,它会运行很长时间 - 因为它的时间复杂度为 O(n^3)

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

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

    内存消耗:

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

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

    检查这个聚类算法,它可能会给出很好的结果。主要问题是DBSCAN自动定义了簇数,所以不能设置为2。

    【讨论】:

      【解决方案2】:

      感谢您的回答! 我不得不使用层次聚类,因为这是研究的情况,所以我跟着 link中描述的解决方案

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-25
        • 2012-10-21
        • 2012-08-18
        • 1970-01-01
        • 1970-01-01
        • 2020-01-18
        • 2023-02-26
        相关资源
        最近更新 更多