如何高效为多数据集应用带不同参数的多Sklearn聚类算法并网格绘图?
高效批量应用聚类算法并可视化的实现方案
核心思路
为了避免重复写冗余代码,我们可以把数据集和带参数的聚类模型都整理成可迭代的序列,通过嵌套循环批量处理所有组合,最后用Matplotlib的网格子图统一展示结果。这种方式不仅简洁,还能轻松扩展更多数据集或算法参数。
完整代码实现
import pandas as pd import numpy as np from sklearn.datasets import make_moons, make_blobs from sklearn.cluster import KMeans, DBSCAN import matplotlib.pyplot as plt # ---------------------- # 1. 准备数据集(封装为带名称的元组,方便可视化标注) # ---------------------- X1, y1 = make_moons(n_samples=100, noise=0.1) X2, y2 = make_blobs(n_samples=100, centers=3, n_features=2) datasets = [ ("半月形数据集", X1, y1), ("球形聚类数据集", X2, y2) ] # ---------------------- # 2. 定义带参数的聚类模型(同样封装为带名称的元组) # 你可以根据需求随时添加更多模型或参数组合 # ---------------------- models = [ ("KMeans (k=2)", KMeans(n_clusters=2, random_state=42)), ("KMeans (k=3)", KMeans(n_clusters=3, random_state=42)), ("DBSCAN (eps=0.2)", DBSCAN(eps=0.2)), ("DBSCAN (eps=0.3)", DBSCAN(eps=0.3)) ] # ---------------------- # 3. 设置绘图网格:行数=数据集数量,列数=模型数量 # ---------------------- fig, axes = plt.subplots( nrows=len(datasets), ncols=len(models), figsize=(16, 8) ) # ---------------------- # 4. 嵌套循环批量处理并绘图 # ---------------------- for dataset_idx, (dataset_name, X, y_true) in enumerate(datasets): for model_idx, (model_name, model) in enumerate(models): # 获取当前子图 ax = axes[dataset_idx][model_idx] # 拟合模型并获取聚类标签 model.fit(X) if hasattr(model, 'predict'): # KMeans等有predict方法的模型 cluster_labels = model.predict(X) else: # DBSCAN直接用labels_属性 cluster_labels = model.labels_ # 绘制聚类结果 ax.scatter(X[:, 0], X[:, 1], c=cluster_labels, cmap='viridis', alpha=0.7) # 设置子图标题和样式 ax.set_title(f"{dataset_name}\n{model_name}", fontsize=10) ax.set_xticks([]) ax.set_yticks([]) # 调整子图间距,避免标题重叠 plt.tight_layout() plt.show()
关键细节说明
- 可扩展性:如果需要添加新数据集,只需在
datasets列表中追加新的元组;添加新算法或参数组合,直接在models列表中添加即可,无需修改循环逻辑。 - 模型兼容:针对不同聚类模型的API差异(比如KMeans有
predict方法,DBSCAN只有labels_属性),用hasattr做了兼容处理,保证代码鲁棒性。 - 可视化优化:关闭了坐标轴刻度,让焦点集中在聚类结果上;用
tight_layout()自动调整子图间距,避免标题和图形重叠。
内容的提问来源于stack exchange,提问作者santoku
相关产品推荐
相关产品推荐

