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): 最终生成的聚类结果可通过树状图表示,显示了不同样本和簇的合并顺序。

凝聚层次聚类的数学公式

我们看一个示例:

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

样本 xx yy
A 1 2
B 1.5 1.8
C 5 8
D 8 8
E 1 1

步骤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()

运行结果:

相关推荐
火星校尉2 分钟前
一场数据基建与消费场景的跨界实验
java·前端·数据库·python·php
Sam09277 分钟前
【AI 算法精讲 14】TF-IDF:词频与逆文档频率
人工智能·python·算法·ai
m0_6265352011 分钟前
MRR(Mean Reciprocal Rank)和 NDCG(Normalized Discounted Cumulative Gain)
人工智能·机器学习
FL162386312927 分钟前
养猪场耳标检测数据集VOC+YOLO格式744张1类别有增强
深度学习·yolo·机器学习
编程圈子34 分钟前
电机驱动开发学习18. SVPWM空间矢量调制算法详解与实现
驱动开发·学习·算法
内蒙深海大鲨鱼38 分钟前
数据操作+数据预处理
python
ai生成式引擎优化技术44 分钟前
从参数驱动到认知行为驱动:SAI范式的理论转向与WSaiOS认知内核架构
python·架构·django·virtualenv·pygame
AI科技星1 小时前
基于32维Cayley_Dickson超复数的全域拓扑统一场论——反重力、真空自持供能、维度瞬移与星际宇宙脑秩序体系
人工智能·学习·算法·机器学习·数据挖掘
想你依然心痛1 小时前
AtomCode在Python数据科学项目中的使用体验:从数据分析到可视化
开发语言·python·数据分析
星马梦缘1 小时前
机器学习与模式识别 第十四章 神经网络中的反向传播 模拟卷及答案
人工智能·神经网络·机器学习·微分·反向传播