Python ValueError:超出了允许的最大尺寸,附聚性群集配合\u

Python ValueError:超出了允许的最大尺寸,附聚性群集配合\u,python,scikit-learn,hierarchical-clustering,Python,Scikit Learn,Hierarchical Clustering,我正在尝试在一个包含10万个对象的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

我正在尝试在一个包含10万个对象的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
>ac=凝聚性聚类(n_聚类=2,亲和性='欧几里德',连锁性='complete')
>>>k=hf.features\u iter(hf.file)
>>>k
数组([[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]],数据类型=uint8)
>>>res=ac.fit\u预测(k)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
层次结构()
文件“C:\Users\Tolis\Downloads\WPy-3670\notebooks\ergasia\clustering.py”,第39行,分层格式
ac.fit_预测(k)
文件“C:\Users\Tolis\Downloads\WPy-3670\python-3.6.7\lib\site packages\sklearn\base.py”,第355行,在fit\u中
自我适应(X)
文件“C:\Users\Tolis\Downloads\WPy-3670\python-3.6.7\lib\site packages\sklearn\cluster\hierarchy.py”,第830行
**kwargs)
文件“C:\Users\Tolis\Downloads\WPy-3670\python-3.6.7\lib\site packages\sklearn\externals\joblib\memory.py”,第329行,在调用中__
返回self.func(*args,**kwargs)
文件“C:\Users\Tolis\Downloads\WPy-3670\python-3.6.7\lib\site packages\sklearn\cluster\hierarchy.py”,第584行,链接完整
返回链接树(*args,**kwargs)
链接树中的文件“C:\Users\Tolis\Downloads\WPy-3670\python-3.6.7\lib\site packages\sklearn\cluster\hierarchy.py”,第470行
out=层次结构.链接(X,方法=链接,度量=关联)
链接中第708行的文件“C:\Users\Tolis\Downloads\WPy-3670\python-3.6.7\lib\site packages\scipy\cluster\hierarchy.py”
y=距离.pdist(y,公制)
文件“C:\Users\Tolis\Downloads\WPy-3670\python-3.6.7\lib\site packages\scipy\space\distance.py”,第1877行,在pdist中
dm=np.empty((m*(m-1))//2,dtype=np.double)
ValueError:超出了允许的最大尺寸

ValueError:我猜超出了允许的最大维度

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

y = distance.pdist(y, metric)
在聚合聚类内部调用

因此,
aggregativeclustering
算法不适合大型甚至中型数据集:

分层凝聚聚类(HAC)的标准算法具有O(n^3)的时间复杂度,需要O(n^2)内存,这使得即使对于中等数据集也太慢

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

(我用~100Gb内存测试了100.000个随机点的成对距离,它的计算时间很长——尽管没有失败)

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

我建议您尝试—它对某些数据()具有类似的行为,而且运行速度更快,占用的内存更少:

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

内存消耗:

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

时间复杂度:平均
O(n logn)
,但取决于实现情况,最坏情况
O(n^2)
-对于凝聚性,这是一种优于
O(n^3)
的方法


检查这个聚类算法,可能会得到很好的结果。主要问题是DBSCAN会自动定义集群的数量,因此不能将其设置为2。

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

y = distance.pdist(y, metric)
在聚合聚类内部调用

因此,
aggregativeclustering
算法不适合大型甚至中型数据集:

分层凝聚聚类(HAC)的标准算法具有O(n^3)的时间复杂度,需要O(n^2)内存,这使得即使对于中等数据集也太慢

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

(我用~100Gb内存测试了100.000个随机点的成对距离,它的计算时间很长——尽管没有失败)

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

我建议您尝试—它对某些数据()具有类似的行为,而且运行速度更快,占用的内存更少:

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

内存消耗:

此实现批量计算所有邻域查询,这将内存复杂性增加到O(n.d),其中d是neig的平均数