层次聚类(Hierarchical Clustering)内存报错及运行卡顿问题求解
问题根源
你遇到的内存不足、后续运行卡顿冻结的核心原因是Agglomerative Clustering(层次凝聚聚类)的算法特性不匹配你的数据规模:
- 标准层次聚类计算时需要生成大小为
n_samples * n_samples的距离矩阵,你的样本量接近28万,生成float64类型的全量距离矩阵确实需要292GB左右的存储空间,远超普通消费级电脑的内存上限 - 就算通过内存优化手段绕过了直接内存报错,层次聚类的时间复杂度为O(n²),28万样本的计算量即使在高性能服务器上也需要极长运行时间,普通电脑自然会直接冻结
可行解决方案
- 方案1:更换适配大规模数据的聚类算法
放弃层次聚类,改用时间/内存复杂度更低的算法,比如:- K-Means:时间复杂度O(nkt),k为聚类数、t为迭代次数,是百万级样本聚类的首选
- DBSCAN:如果聚类形状不规则,可改用基于密度的DBSCAN,搭配KD树等优化结构也能支撑十万级样本
示例K-Means代码参考:
from sklearn.cluster import KMeans model = KMeans(n_clusters=3, random_state=42) labels_ = model.fit_predict(dfAB1) - 方案2:下采样后再用层次聚类
如果必须使用Complete Linkage层次聚类,可对原始数据做随机下采样,将样本量压缩到1万以内,此时距离矩阵大小仅需约800MB,普通电脑可正常运行:
下采样示例代码:# 随机采样10000条数据,可根据自身内存调整采样量 df_sampled = dfAB1.sample(n=10000, random_state=42) hc_complete = linkage(df_sampled, "complete") model = AgglomerativeClustering(n_clusters=3, affinity='euclidean', linkage='complete') model.fit(df_sampled) labels_ = model.labels_ - 方案3:使用优化版层次聚类实现
可改用针对大规模数据优化的层次聚类实现,比如fastcluster库的linkage方法,相比scipy原生实现内存占用和运行速度都有明显提升,可支撑更大的样本量:
安装及使用示例:# 先执行pip install fastcluster安装依赖 import fastcluster hc_complete = fastcluster.linkage(dfAB1, method="complete") - 方案4:降维减少特征量
如果你的原始数据特征维度非常高,可先用PCA、TSNE等降维方法将特征维度压缩后再做聚类,也能明显降低内存占用和计算量。
内容的提问来源于stack exchange,提问作者ALPER AYTATLI
相关产品推荐
相关产品推荐

