当前位置: 首页 > news >正文

Scikit-learn 1.5.0 AgglomerativeClustering 实战:3种连接方式对鸢尾花数据集聚类效果对比

Scikit-learn 1.5.0 层次聚类实战:3种连接方式对鸢尾花数据集的深度解析

鸢尾花数据集作为机器学习领域的经典案例,常被用于验证聚类算法的有效性。本文将聚焦Scikit-learn 1.5.0中的AgglomerativeClustering算法,通过完整代码示例和可视化分析,深入探讨单链接、全链接和平均链接三种连接方式对聚类结果的影响差异。

1. 环境准备与数据加载

首先确保已安装最新版本的Scikit-learn(1.5.0+)及相关可视化库。我们使用经典的鸢尾花数据集,它包含150个样本,每个样本有4个特征(萼片长度、萼片宽度、花瓣长度、花瓣宽度)和对应的3个类别标签。

# 基础环境配置 import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import load_iris from sklearn.cluster import AgglomerativeClustering from sklearn.metrics import silhouette_score, calinski_harabasz_score from sklearn.preprocessing import StandardScaler import scipy.cluster.hierarchy as sch # 加载并预处理数据 iris = load_iris() X = iris.data y = iris.target feature_names = iris.feature_names # 数据标准化 scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # 可视化特征分布 plt.figure(figsize=(12, 6)) for i in range(4): plt.subplot(2, 2, i+1) plt.hist(X[:, i], bins=20, alpha=0.7) plt.title(f'Distribution of {feature_names[i]}') plt.tight_layout() plt.show()

提示:标准化是聚类前的关键步骤,特别是当特征量纲差异较大时。Z-score标准化能确保各特征对距离计算的贡献均衡。

2. 三种连接方式的原理剖析

层次聚类的核心差异在于簇间距离的计算方式。Scikit-learn提供了三种主要连接方式:

2.1 单链接(Single Linkage)

  • 定义:取两簇中最近的两个样本点的距离
  • 数学表达:$D_{single}(A,B) = \min_{a∈A,b∈B} d(a,b)$
  • 特点:容易形成"链条状"簇,对噪声敏感但能发现非球形簇

2.2 全链接(Complete Linkage)

  • 定义:取两簇中最远的两个样本点的距离
  • 数学表达:$D_{complete}(A,B) = \max_{a∈A,b∈B} d(a,b)$
  • 特点:生成紧凑的球形簇,对噪声鲁棒但可能分割大簇

2.3 平均链接(Average Linkage)

  • 定义:计算两簇所有样本点对的平均距离
  • 数学表达:$D_{average}(A,B) = \frac{1}{|A||B|}\sum_{a∈A}\sum_{b∈B} d(a,b)$
  • 特点:平衡前两种方法,兼顾鲁棒性和形状适应性

3. 聚类实现与可视化对比

我们分别用三种连接方式对鸢尾花数据进行聚类,并通过树状图和二维投影展示结果差异。

# 设置三种连接方式 linkage_methods = ['single', 'complete', 'average'] results = {} # 训练不同模型并评估 for method in linkage_methods: model = AgglomerativeClustering(n_clusters=3, linkage=method) clusters = model.fit_predict(X_scaled) # 计算评估指标 sil_score = silhouette_score(X_scaled, clusters) ch_score = calinski_harabasz_score(X_scaled, clusters) # 存储结果 results[method] = { 'model': model, 'clusters': clusters, 'silhouette': sil_score, 'calinski_harabasz': ch_score } # 绘制树状图对比 plt.figure(figsize=(18, 5)) for i, method in enumerate(linkage_methods, 1): plt.subplot(1, 3, i) dendrogram = sch.dendrogram(sch.linkage(X_scaled, method=method)) plt.title(f'{method.capitalize()} Linkage Dendrogram') plt.xlabel('Sample Index') plt.ylabel('Distance') plt.tight_layout() plt.show()

树状图直观展示了不同连接方式形成的层次结构:

  • 单链接:呈现明显的"链条效应",合并距离增长缓慢
  • 全链接:合并距离跳跃明显,形成清晰的层次
  • 平均链接:介于两者之间,层次结构较为平衡

4. 结果分析与性能对比

我们选取花瓣长度和宽度这两个最具判别性的特征进行二维可视化,并量化评估各方法的性能。

# 创建评估对比表格 metrics_table = [ ["Method", "Silhouette Score", "Calinski-Harabasz Index"], ["Single", results['single']['silhouette'], results['single']['calinski_harabasz']], ["Complete", results['complete']['silhouette'], results['complete']['calinski_harabasz']], ["Average", results['average']['silhouette'], results['average']['calinski_harabasz']] ] # 二维可视化 plt.figure(figsize=(18, 6)) for i, method in enumerate(linkage_methods, 1): plt.subplot(1, 3, i) scatter = plt.scatter(X[:, 2], X[:, 3], c=results[method]['clusters'], cmap='viridis', alpha=0.7) plt.title(f'{method.capitalize()} Linkage (Sil={results[method]["silhouette"]:.2f})') plt.xlabel('Petal Length') plt.ylabel('Petal Width') plt.colorbar(scatter, label='Cluster') plt.tight_layout() plt.show()

性能指标对比如下:

连接方式轮廓系数Calinski-Harabasz指数
单链接0.51285.43
全链接0.59323.68
平均链接0.56310.25

从结果可以看出:

  1. 全链接在两项指标上均表现最佳,生成的簇最紧凑且分离度最好
  2. 平均链接表现接近全链接,但在轮廓系数上略低
  3. 单链接表现相对最弱,这与它容易形成链条状簇的特性有关

5. 技术细节与参数优化

在实际应用中,有几个关键参数会影响层次聚类的效果:

5.1 距离度量选择

除了默认的欧氏距离,Scikit-learn还支持:

  • Manhattan距离(metric="manhattan"
  • Cosine相似度(metric="cosine"
  • 自定义距离函数
# 使用余弦相似度的示例 cosine_model = AgglomerativeClustering( n_clusters=3, affinity='cosine', linkage='average' ) cosine_clusters = cosine_model.fit_predict(X_scaled)

5.2 确定最佳簇数

虽然我们已知鸢尾花有3类,但实际应用中常需确定最佳簇数。常用的方法包括:

  • 观察树状图的明显跳跃
  • 轮廓系数随簇数的变化
  • Gap统计量
# 轮廓系数法寻找最佳K k_range = range(2, 8) sil_scores = [] for k in k_range: model = AgglomerativeClustering(n_clusters=k, linkage='average') clusters = model.fit_predict(X_scaled) sil_scores.append(silhouette_score(X_scaled, clusters)) plt.plot(k_range, sil_scores, marker='o') plt.xlabel('Number of clusters') plt.ylabel('Silhouette Score') plt.title('Optimal Cluster Number Selection') plt.show()

6. 高级应用与扩展思考

6.1 特征重要性分析

通过观察不同特征组合对聚类结果的影响,可以识别最具判别力的特征:

# 测试不同特征组合的效果 feature_combinations = [ [0, 1], # 萼片特征 [2, 3], # 花瓣特征 [0, 2], # 长度特征 [1, 3] # 宽度特征 ] for features in feature_combinations: X_subset = X_scaled[:, features] model = AgglomerativeClustering(n_clusters=3, linkage='average') clusters = model.fit_predict(X_subset) score = silhouette_score(X_subset, clusters) print(f"Features {[feature_names[i] for i in features]}: Silhouette={score:.3f}")

6.2 大规模数据优化

对于大数据集,常规层次聚类O(n³)复杂度可能过高,可考虑:

  • 使用BIRCH算法
  • 设置connectivity约束矩阵
  • 采用采样方法
from sklearn.cluster import Birch # BIRCH示例 birch_model = Birch(n_clusters=3, threshold=0.5) birch_model.fit(X_scaled)

层次聚类作为探索性数据分析的有力工具,其价值不仅在于最终聚类结果,更在于揭示数据内在的层次结构关系。通过本实验我们可以清晰看到,不同连接方式会导致完全不同的聚类视角,在实际应用中需要根据数据特性和分析目标进行选择。

http://www.jsqmd.com/news/1132800/

相关文章:

  • Insta360 AI剪辑深度解析:从视频理解到模板化叙事的效率革命
  • 科大讯飞办公本X2深度体验:E Ink办公本的本地AI与手写工作流
  • 3分钟搞定一学期教材下载?这款免费工具让备课效率提升500%
  • REPENTOGON 安装配置指南:快速集成脚本扩展器到《以撒的结合:悔改》
  • RAG 入门:检索增强生成是什么,解决什么问题
  • 如何用一个API搞定六大音乐平台?Listen1 API跨平台音乐聚合终极指南
  • NohBoard:终极免费键盘可视化工具,让按键操作一目了然
  • 实战指南:如何构建高性能Android电视媒体中心 - VLC电视版深度配置与优化
  • 降重后论文逻辑全乱,有哪些真正实力出众的的AI智能降重工具推荐?
  • Power BI热力图实战:用Matrix构建业务可读的二维数据洞察
  • SciPy 1.18 L-BFGS-B 实战:5个关键参数调优与收敛速度对比分析
  • 终极精简指南:如何用tiny11builder让Windows 11瘦身50%提升性能
  • 一天半切完10套详情页!我用 Codex 跑通的 AI 视觉 SOP 避坑指南
  • AutoClicker:解放双手的鼠标自动化革命,让重复点击成为历史
  • 3步搞定Windows安装安卓应用:APK安装器完整指南
  • 5个步骤让电子墨水屏设备续航翻倍的Android启动器
  • REPENTOGON脚本扩展器:解锁《以撒的结合》MOD开发新维度
  • 高速PCB信号完整性设计:从100MHz到GHz的5个关键阻抗控制实战
  • MatAnyone:打破绿幕束缚,AI视频抠像的终极解决方案
  • 如何彻底优化Windows系统:Win11Debloat终极指南
  • 突破壁垒:APK Installer让Windows系统原生运行安卓应用
  • OpenDog V3:探索开源四足机器人设计的民主化之路与实现路径
  • RevokeMsgPatcher技术深度解析:PC端消息防撤回实现原理与实战指南
  • PyTorch与Torchvision版本兼容性:5个常见匹配错误与排查方案
  • Alissa 保姆配置篇
  • Openclaw进阶配置手册:STM32H7机械爪硬实时控制实战指南
  • 毕设分享 深度学习手写数字识别系统(源码+论文)
  • 星露谷物语MOD终极指南:轻松打造你的智能农场
  • STM32G0B1RE与IIM-42652实现6DoF姿态估计
  • Docker--搭建私有镜像中心Harbor