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

发布时间:2026/9/26 3:40:55

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值否是是抗噪声能力强弱中可视化能力中中强保持拓扑否否是适合大数据否是中在实际项目中选择聚类算法应考虑数据规模和维度预期的簇形状是否需要层次结构可视化需求计算资源限制

相关新闻

Agent可交付设计:从OpenClaw配置到审批流可视化

Agent可交付设计:从OpenClaw配置到审批流可视化

2026/9/4 17:09:15

1. 项目概述:从“我用着顺手”到“别人也能开箱即用”,Agent 交付的本质不是功能堆砌,而是体验封装“我自己用的 Agent 挺好,怎么变成别人也能用的?”——这句话背后藏着一个被严重低估的现实:90% 的 Agent…

工业信号干扰解决方案与光耦选型实践

工业信号干扰解决方案与光耦选型实践

2026/9/5 14:28:03

1. 工业环境中的信号干扰挑战在电机控制、PLC系统或自动化产线等工业场景中,电子设备常面临严峻的电磁环境。变频器、大功率继电器和无线设备产生的电磁噪声,可能使信号传输出现以下典型问题:数字信号边沿抖动(上升/下降时间劣化&…

锂离子电池组电压平衡技术与BQ25887应用解析

锂离子电池组电压平衡技术与BQ25887应用解析

2026/9/23 16:23:40

1. 电池单元平衡技术背景与核心挑战在锂离子电池组应用中,串联电池单元之间的电压不平衡是影响整体性能和寿命的关键问题。当多个电池单元串联使用时,由于制造工艺差异、温度分布不均或老化程度不同,各单元的实际容量和荷电状态(S…

CANN/GE ACL数据集缓冲区添加函数

CANN/GE ACL数据集缓冲区添加函数

2026/9/25 10:06:33

aclmdlAddDatasetBuffer 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、Te…

用ffmpeg高效批量调整图片尺寸的实战指南

用ffmpeg高效批量调整图片尺寸的实战指南

2026/9/25 9:40:47

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱

2026/9/25 10:06:21

Transformers 音频特征提取工具库 audio_utils 全解析:从 Mel 刻度换算到对数 Mel 频谱 【免费下载链接】transformers 🤗 Transformers: the model-definition framework for state-of-the-art machine learning models in text, vision, audio, and mu…

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南

2026/9/25 9:53:52

RustFS 多节点集群重启与滚动升级实战:Readiness、Quorum 与 Degraded 模式完全指南 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system sup…

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

Java Integer缓存揭秘:128陷阱原理、避坑与面试全解

2026/9/25 8:58:17

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据

2026/9/25 10:00:17

RustFS Scanner 数据用量发布权威性决策:配额准入如何获得可用的权威依据 【免费下载链接】rustfs 🚀2.3x faster than MinIO for 4KB object payloads. RustFS is an open-source, S3-compatible high-performance object storage system supporting mi…

远程协作的工作台整理

远程协作的工作台整理

2026/9/24 16:02:49

远程协作的工作台整理远程协作的核心不是再加一个工具,而是让交接信息足够完整。异步任务要写明目标、输入位置、完成标准和需要决策的人。 工作台的最小配置 将日程、待办、代码和沟通入口收拢到少数固定位置;通知按紧急程度分层。工作台不需要模仿办公…

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

2026/9/25 9:41:47

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

2026/9/25 4:22:14

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…