当前位置: 首页 > 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.dtcms.com/a/418338.html

相关文章:

  • 便宜的自制 30 MHz - 6 GHz 矢量网络分析仪
  • Meta Ray-Ban Display眼镜将引领AR眼镜的智能化应用落地
  • C++篇 Vector模拟实现(1) 初始化 迭代器遍历 插入尾插尾删 一文详解
  • 学习日报 20250928|React 中实现 “实时检测”:useEffect 依赖项触发机制详解
  • 怎么样可以做自己的网站做网站投注代理犯罪吗
  • 网站空间是服务器吗成都网站设计建设推荐
  • 基于 LangGraph 框架实现智能研究助手示例程序
  • 常用网络命令
  • 实验指导-基于阿里云函数计算的简单邮件发送服务 之数据库访问中间件
  • PPO算法
  • 网站建设公司方维wordpress 上传文件路径
  • gRPC0到1系列之【6】
  • 【Java系列课程·Java学前须知】第3课 JDK,JVM,JRE的区别和优缺
  • JVM栈溢出时如何dump栈信息?
  • 重庆奉节网站建设公司重庆沙坪坝地图全图
  • RK3588芯片与板卡全面解析:旗舰级AIoT与边缘计算的核心
  • 226.翻转二叉树(二叉树算法题)
  • #itertools.product
  • AcWing 1172:祖孙询问 ← 倍增法求LCA(DFS预处理)
  • C语言 分支结构(1)
  • 扭蛋机抽赏小程序:重构线上娱乐的“盲盒式”新体验
  • EtherNet/IP转EtherCAT网关在新能源制造中实现机器人与运动卡数据互通
  • Imatest-Wedge模块
  • 岳阳博物馆网站网站建设想法
  • Day03_STM32F103C8T6学习笔记6-9章(江科大)
  • 专业企业网站搭建服务docker创建wordpress
  • 各大网站的网址网站的功能性
  • ZYNQ平台摄像头性能深度对决:OV7725 vs OV5640全面速度测试与优化实战
  • Qt 界面优化 --- 绘图
  • MySQL Online DDL:高性能表结构变更指南