ValueError:超过了允许的最大维度,AggregationClustering fit_predict



我正在尝试在100000个对象的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:UsersTolisDownloadsWPy-3670notebooksergasiaclustering.py", line 39, in hierarchical
ac.fit_predict(k)
File "C:UsersTolisDownloadsWPy-3670python-3.6.7libsite-packagessklearnbase.py", line 355, in fit_predict
self.fit(X)
File "C:UsersTolisDownloadsWPy-3670python-3.6.7libsite-packagessklearnclusterhierarchical.py", line 830, in fit
**kwargs)
File "C:UsersTolisDownloadsWPy-3670python-3.6.7libsite-packagessklearnexternalsjoblibmemory.py", line 329, in __call__
return self.func(*args, **kwargs)
File "C:UsersTolisDownloadsWPy-3670python-3.6.7libsite-packagessklearnclusterhierarchical.py", line 584, in _complete_linkage
return linkage_tree(*args, **kwargs)
File "C:UsersTolisDownloadsWPy-3670python-3.6.7libsite-packagessklearnclusterhierarchical.py", line 470, in linkage_tree
out = hierarchy.linkage(X, method=linkage, metric=affinity)
File "C:UsersTolisDownloadsWPy-3670python-3.6.7libsite-packagesscipyclusterhierarchy.py", line 708, in linkage
y = distance.pdist(y, metric)
File "C:UsersTolisDownloadsWPy-3670python-3.6.7libsite-packagesscipyspatialdistance.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)

在CCD_ 1内部调用。

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

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

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

(我已经用大约100Gb的RAM测试了100000个随机点的成对距离,它计算的时间太长了——尽管没有失败)

此外,由于它的O(n^3)时间复杂性,它将运行很长时间。

我建议你尝试sklearn.cluster.DBSCAN——它对一些数据有类似的行为(sklearn示例),而且它运行得更快,消耗的内存更少:

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

内存消耗:

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

时间复杂度:平均值为O(n log n),但取决于实现,最坏情况为AgglomerativeClustering0,这比O(n^3)在凝聚方面要好得多。

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

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

相关内容

  • 没有找到相关文章

最新更新