我正在尝试使层次聚类适合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:超出了最大允许尺寸
答案 0 :(得分:0)
我猜-由于该算法的某些特性,因此无法使用聚集聚类解决此问题。您可以在使用该功能时测量所有对象对之间的距离
y = distance.pdist(y, metric)
在AgglomerativeClustering
内部被调用。
因此,AgglomerativeClustering
算法不适用于大型或中型数据集:
用于分层聚集聚类(HAC)的标准算法的时间复杂度为O(n ^ 3),并且需要O(n ^ 2)内存,这对于中等数据集来说也太慢了。
-因为它很慢,而且还有O(n^2)
内存。即使算法以最佳方式使用RAM,成对距离矩阵也会消耗〜1e10 * 4
个字节(约40Gb)的内存-因为每个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。
答案 1 :(得分:0)
感谢您的回答! 我必须使用分层聚类,因为这是研究的案例,所以我遵循了 link
中描述的解决方案