Jupyter Notebook内核在样本量增至24000时崩溃求助
解决层次聚类样本量增大导致Jupyter内核崩溃的问题
执行以下Python代码绘制树状图:
plt.figure(figsize=(9,6)) plt.title("Dendrograms for number of clusters") dend = sch.dendrogram(sch.linkage(scaled, method='ward'))样本量12000时运行正常,但增至24000时Jupyter Notebook提示
Kernel appears to be dead和KernelRestarter: restarting kernel (1/5), keep random ports。
核心原因
层次聚类的linkage函数(尤其是ward方法)时间复杂度为O(n³),空间复杂度为O(n²)。当样本量从12000翻倍到24000时,计算量变为原来的8倍,内存占用变为原来的4倍,直接超出了当前环境的资源上限,导致内核因资源耗尽崩溃。
可行解决方案
- 使用近似层次聚类算法:换用
sklearn.cluster.AgglomerativeClustering,设置compute_distances=False避免存储庞大的距离矩阵,同时通过n_clusters指定目标聚类数量,跳过完整树状图的计算(如果无需绘制全量树状图)。示例代码:from sklearn.cluster import AgglomerativeClustering cluster = AgglomerativeClustering(n_clusters=5, linkage='ward') cluster_labels = cluster.fit_predict(scaled) - 采样后绘制树状图:从24000个样本中随机抽取部分样本(比如5000个),用采样数据生成树状图来判断聚类数量,再用全量数据执行聚类。示例代码:
import numpy as np # 随机采样5000个样本 sample_indices = np.random.choice(scaled.shape[0], 5000, replace=False) scaled_sample = scaled[sample_indices] # 绘制采样数据的树状图 plt.figure(figsize=(9,6)) plt.title("Dendrograms for sampled data") dend = sch.dendrogram(sch.linkage(scaled_sample, method='ward')) - 提升硬件资源:增加Jupyter环境的内存分配(比如启动Jupyter时通过
--NotebookApp.max_buffer_size调整参数,或在云平台选择更高配置的计算实例),同时确保CPU核心数能支撑大计算量需求。 - 改用低复杂度聚类算法:如果不需要层次聚类的树状图辅助分析,可替换为K-Means、DBSCAN等算法,这类算法在大样本量下的时间和空间效率远高于层次聚类。
内容的提问来源于stack exchange,提问作者Souradip Roy
相关产品推荐
相关产品推荐

