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

深入解析:Scikit-learn Python机器学习 - 聚类分析算法 - Agglomerative Clustering(凝聚层次聚类)

锋哥原创的Scikit-learn Python机器学习视频教程:

https://www.bilibili.com/video/BV11reUzEEPH

课程介绍

本课程主要讲解基于Scikit-learn的Python机器学习知识,包括机器学习概述,特征工程(数据集,特征抽取,特征预处理,特征降维等),分类算法(K-临近算法,朴素贝叶斯算法,决策树等),回归与聚类算法(线性回归,欠拟合,逻辑回归与二分类,K-means算法)等。

Scikit-learn Python机器学习 - 聚类分析算法 - Agglomerative Clustering(凝聚层次聚类)

Agglomerative Clustering(凝聚层次聚类)是一种自底向上的层次聚类方法,属于无监督学习的一种。它通过逐步将最相似的样本合并成一个簇(cluster),最终得到一个包含所有样本的簇,形成一个层次结构(树状图)。与其他聚类方法(如K-means)不同,凝聚层次聚类不需要事先指定簇的数量。

算法原理

凝聚层次聚类的核心思想是基于距离(或相似度)度量来逐步合并样本或簇。

步骤

  1. 初始化: 每个样本初始化为一个簇。

  2. 计算距离: 计算每对簇之间的距离(或相似度)。距离计算方法可以有不同的选择,常见的有:

    • 单链接(Single Linkage): 两个簇之间的最小距离(即簇间最近的两个样本之间的距离)。

    • 完全链接(Complete Linkage): 两个簇之间的最大距离(即簇间最远的两个样本之间的距离)。

    • 均值链接(Average Linkage): 两个簇之间的平均距离。

    • 中心链接(Centroid Linkage): 两个簇之间的中心点距离。

  3. 合并最近的簇: 选择距离最小的两个簇,合并成一个新的簇。

  4. 重复步骤2和3: 不断计算簇间距离并合并,直到所有样本合并为一个簇或达到预设的簇数。

  5. 树状图(Dendrogram): 最终生成的聚类结果可通过树状图表示,显示了不同样本和簇的合并顺序。

凝聚层次聚类的数学公式

我们看一个示例:

假设我们有以下二维数据点:

样本xxyy
A12
B1.51.8
C58
D88
E11

步骤1: 计算每一对数据点之间的距离(例如使用欧几里得距离)。

...(继续计算其他距离)

步骤2: 找到距离最小的两个点或簇。假设 AA 和 BB 之间的距离最小,我们首先将 AA 和 BB 合并为一个簇。

步骤3: 计算新簇与其他数据点的距离,并重复步骤2和3直到所有数据点合并为一个簇。

API介绍

在Scikit-learn中,AgglomerativeClustering 类可以实现凝聚层次聚类。

AgglomerativeClustering(n_clusters=2,              # 最重要的参数:聚类数量*,                         # 后面必须使用关键字参数metric='euclidean',        # 距离度量方法linkage='ward',            # 链接准则distance_threshold=None,   # 距离阈值(替代n_clusters)compute_full_tree='auto',  # 是否计算完整树compute_distances=False    # 是否计算距离
)

核心参数介绍:

  1. n_clusters - 聚类数量

  • 作用:指定最终要形成的簇的数量

  • 类型:int

  • 默认值:2

  1. metric - 距离度量

  • 作用:定义数据点之间的距离计算方法

  • 常用选项

    • 'euclidean':欧几里得距离(默认)

    • 'manhattan':曼哈顿距离

    • 'cosine':余弦距离

  1. linkage - 链接准则

  • 作用:定义簇与簇之间的合并策略

  • 常用选项

    • 'ward':沃德法(默认,最小化方差)

    • 'complete':全链接(最大距离)

    • 'average':平均链接

    • 'single':单链接(最小距离)

  1. distance_threshold - 距离阈值

  • 作用:当簇间距离超过此值时停止合并

  • 类型:float 或 None

  • 注意:设置此参数时,n_clusters 必须为 None

具体示例

import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import AgglomerativeClustering
from sklearn.datasets import make_blobs
from sklearn.metrics import silhouette_score
import scipy.cluster.hierarchy as sch
# 设置中文字体支持
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
# 生成示例数据
X, y_true = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)
# 应用凝聚层次聚类
agg_clustering = AgglomerativeClustering(n_clusters=4, linkage='ward')
y_pred = agg_clustering.fit_predict(X)
# 评估聚类效果
silhouette_avg = silhouette_score(X, y_pred)
print(f"轮廓系数: {silhouette_avg:.3f}")
# 可视化结果
plt.figure(figsize=(15, 5))
# 原始数据
plt.subplot(1, 3, 1)
plt.scatter(X[:, 0], X[:, 1], c=y_true, cmap='viridis')
plt.title('原始数据 (真实标签)')
# 聚类结果
plt.subplot(1, 3, 2)
plt.scatter(X[:, 0], X[:, 1], c=y_pred, cmap='viridis')
plt.title('凝聚层次聚类结果')
# 树状图
plt.subplot(1, 3, 3)
dendrogram = sch.dendrogram(sch.linkage(X, method='ward'))
plt.title('树状图')
plt.xlabel('样本索引')
plt.ylabel('距离')
plt.tight_layout()
plt.show()

运行结果:

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

相关文章:

  • 多维协同 一键化部署 合规可控的运营商数据安全管理方案
  • 学习随笔一:低代码开发与 SQL 核心知识
  • firewalld和iptables的区别与应用
  • 视觉定位引导劈刀修磨系统赋能芯片封装
  • @wraps(func)
  • antdx 如何接入dify
  • 大素材毕业设计选题推荐-基于大数据的全球经济指标数据分析与可视化环境-Hadoop-Spark-数据可视化-BigData
  • D. MAD Interactive Problem
  • 在 gitea 服务器端查询 lfs 文件占用情况
  • HDR图像生成算法详解
  • Introduction: Why Optimization?
  • 基于MATLAB的二自由度机械臂PID控制仿真
  • Spring AOP原理
  • Azure VM (46) 分布式tcping监控
  • Ventoy引导Kali live USB持久化
  • 知识库管理工具深度测评:ONES、Confluence 等10款工具全面对比
  • 从SGD到AdamW:深度学习优化器演进全解析与实践指南
  • 【面试题】人工智能工程师高频面试题汇总:循环神经网络篇(题目+答案)
  • 做了个手机上的“视频播放器”,获益匪浅
  • CEF关闭流程
  • AI一周资讯 251005-251015
  • 2025 年中空百叶源头厂家最新推荐排行榜:聚焦国内优质供货商,助力客户精准选购可靠产品光能/光伏/电动/光动中空百叶厂家推荐
  • 2025年学校家具定制厂家最新权威推荐榜:全屋定制/衣柜/厨柜/酒柜/鞋柜/猫柜/酒店办公家具/电视柜/书包柜/图书架/宿舍上下床
  • 075_尚硅谷_位运算深度讲解
  • iOS框架内存中占用很高的ttc文件是否正常
  • Linux配置SSH名称通信
  • cors跨域疑问解决
  • D. Not Alone
  • MPC模型预测控制:原理、设计与MATLAB实现
  • 2025年焊接变位机厂家最新权威推荐榜:双轴变位机专业制造商,高效稳定助力智能焊接升级