我试图在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 * 4
字节(〜的40Gb)оf存储器 - 因为每个float32
值消耗4个字节,有这样的测量的10.000 * 10.000
。也许没有足够的内存。
(我测试过的成对距离100.000与100Gb的〜RAM随机点,SOOOO长时间计算 - althought没有失败)
此外,它会运行很长一段时间 - 因为它的O(n^3)
时间复杂度。
我建议你尝试sklearn.cluster.DBSCAN
- 它有一些数据(sklearn examples)类似的行为,另外,它运行的方式速度更快,占用更少的内存:
DBSCAN - 与噪声方面的应用基于密度的空间聚类。发现高密度的岩芯样品并从中扩展群集。适合包含类似密度的集群数据。
内存消耗:
这种实现批量计算所有邻居的查询,这增加了记忆的复杂性O(未检出),其中d是邻居的平均数,而原DBSCAN有记忆复杂度为O(N)。查询这些最近的居民区时,根据不同的算法,它可能吸引更高的存储复杂
时间复杂度:平均O(n log n)
,而是取决于执行情况,最坏情况O(n^2)
- 一种比O(n^3)
更好地凝聚。
勾选此聚类算法,或许它会给好的结果。主要的问题是,DBSCAN自动定义集群的数量,所以不能将其设置为2。
感谢您的回答!我不得不使用分层聚类,因为这是学习的情况下,所以我也跟着在qazxsw POI描述的解决方案