Python scikit-learn 1.4 实战:3种聚类算法(系统/动态/有序)核心差异与代码对比

发布时间:2026/7/9 21:50:31
Python scikit-learn 1.4 实战:3种聚类算法(系统/动态/有序)核心差异与代码对比 Python scikit-learn 1.4 实战3种聚类算法核心差异与代码对比在数据科学领域聚类分析是最常用的无监督学习技术之一。不同于分类问题聚类算法不需要预先标记的训练数据而是通过发现数据中的自然分组来揭示隐藏的模式。本文将聚焦于三种最具代表性的聚类方法系统聚类层次聚类、动态聚类K-means和有序聚类SOM通过scikit-learn 1.4版本的实际代码演示帮助读者理解它们的内在机理和适用场景。1. 环境准备与数据生成在开始比较三种聚类算法之前我们需要准备一个标准化的实验环境。这里使用scikit-learn的make_blobs函数生成包含三个明显簇的数据集同时添加一些噪声点以增加挑战性import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import make_blobs # 生成样本数据 X, y make_blobs(n_samples500, centers3, cluster_std0.8, random_state42) # 添加随机噪声 np.random.seed(42) noise np.random.uniform(low-5, high5, size(20, 2)) X np.vstack([X, noise]) plt.figure(figsize(8, 6)) plt.scatter(X[:, 0], X[:, 1], s50, alpha0.6) plt.title(原始数据分布) plt.show()这个数据集具有以下特点包含520个二维数据点三个主要簇的中心明显分离添加了20个均匀分布的噪声点簇内标准差设置为0.8以保证适度重叠提示在实际项目中数据预处理如标准化通常是必要步骤。本例省略此步骤是因为生成的数据已处于相近尺度。2. 系统聚类层次聚类实现与分析系统聚类又称层次聚类通过构建树状图dendrogram来展示数据的层次分解过程。scikit-learn中的AgglomerativeClustering实现了自底向上的聚合策略。2.1 算法原理与参数选择层次聚类的核心是定义簇间距离度量方式。常见选项包括Ward最小化簇内方差默认Complete最大簇间距离Average平均簇间距离Single最小簇间距离from sklearn.cluster import AgglomerativeClustering from scipy.cluster.hierarchy import dendrogram, linkage # 计算连接矩阵 Z linkage(X, methodward) # 绘制树状图 plt.figure(figsize(12, 6)) dendrogram(Z, truncate_modelastp, p12) plt.title(层次聚类树状图) plt.xlabel(样本索引) plt.ylabel(距离) plt.show()2.2 模型训练与结果可视化# 训练模型 hierarchical AgglomerativeClustering(n_clusters3, affinityeuclidean, linkageward) hierarchical_labels hierarchical.fit_predict(X) # 可视化结果 plt.figure(figsize(8, 6)) plt.scatter(X[:, 0], X[:, 1], chierarchical_labels, s50, alpha0.6, cmapviridis) plt.title(层次聚类结果) plt.show()层次聚类的优势在于不需要预先指定簇数可通过树状图分析能够展示数据的层次结构对噪声相对鲁棒但计算复杂度较高O(n³)不适合大规模数据集。3. 动态聚类K-means实现与分析K-means是最著名的动态聚类算法通过迭代优化簇中心和样本分配来最小化簇内平方和。3.1 算法流程与关键参数K-means的核心参数是n_clusters簇数。我们可以使用肘部法则确定最佳K值from sklearn.cluster import KMeans # 计算不同K值的SSE sse [] for k in range(1, 10): kmeans KMeans(n_clustersk, random_state42) kmeans.fit(X) sse.append(kmeans.inertia_) # 绘制肘部图 plt.figure(figsize(8, 6)) plt.plot(range(1, 10), sse, markero) plt.xlabel(簇数 (K)) plt.ylabel(SSE) plt.title(肘部法则确定最佳K值) plt.show()3.2 模型训练与性能评估# 训练K-means模型 kmeans KMeans(n_clusters3, random_state42) kmeans_labels kmeans.fit_predict(X) # 可视化结果 plt.figure(figsize(8, 6)) plt.scatter(X[:, 0], X[:, 1], ckmeans_labels, s50, alpha0.6, cmapviridis) plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], cred, s200, markerX) plt.title(K-means聚类结果) plt.show()K-means的优势包括计算效率高O(n)实现简单易于理解对球形簇效果良好但存在以下局限需要预先指定K值对初始中心敏感对非球形簇效果不佳对噪声和异常值敏感4. 有序聚类自组织映射SOM实现与分析自组织映射SOM是一种特殊的神经网络通过竞争学习将高维数据映射到低维通常是二维网格上保持拓扑结构。4.1 SOM实现与训练虽然scikit-learn未直接提供SOM实现我们可以使用minisom库!pip install minisom from minisom import MiniSom # 初始化SOM som MiniSom(x5, y5, input_len2, sigma1.0, learning_rate0.5, random_seed42) # 训练SOM som.train_random(X, 500) # 获取聚类标签 som_labels np.array([som.winner(x) for x in X]) som_labels som_labels[:, 0] * 5 som_labels[:, 1] # 转换为单一标签 # 可视化结果 plt.figure(figsize(10, 8)) plt.pcolor(som.distance_map().T, cmapbone_r) plt.colorbar() for i, (x, y) in enumerate(X): w som.winner(x) plt.plot(w[0]0.5, w[1]0.5, o, markerfacecolorplt.cm.viridis(som_labels[i]/25.), markeredgecolork, markersize10, alpha0.7) plt.title(SOM聚类结果) plt.show()4.2 SOM特点分析SOM的优势在于保持数据的拓扑结构可视化能力强适合探索性数据分析但存在以下挑战训练过程复杂需要调整多个超参数解释性相对较差5. 三种算法综合对比为了系统比较三种算法的性能我们使用轮廓系数和Calinski-Harabasz指数进行评估from sklearn.metrics import silhouette_score, calinski_harabasz_score # 评估指标计算 metrics { 层次聚类: { 轮廓系数: silhouette_score(X, hierarchical_labels), CH指数: calinski_harabasz_score(X, hierarchical_labels) }, K-means: { 轮廓系数: silhouette_score(X, kmeans_labels), CH指数: calinski_harabasz_score(X, kmeans_labels) }, SOM: { 轮廓系数: silhouette_score(X, som_labels), CH指数: calinski_harabasz_score(X, som_labels) } } # 展示结果对比 import pandas as pd pd.DataFrame(metrics).T算法对比总结特性层次聚类K-meansSOM计算复杂度高低中需要预设K值否是是抗噪声能力强弱中可视化能力中中强保持拓扑否否是适合大数据否是中在实际项目中选择聚类算法应考虑数据规模和维度预期的簇形状是否需要层次结构可视化需求计算资源限制