【AI深究】层次聚类(Hierarchical Clustering)四大链接法全网最详细全流程详解与案例(附Python代码演示) | 单链法、全链法、平均法、中心法 | 例子案例及数据

大家好,我是爱酱。本期我们将用详细案例和流程,分别演示单链法、全链法、平均法和中心法四种主流链接方式的层次聚类。每种方法都配有具体合并步骤、距离计算和结果解读,帮助新手和进阶读者彻底理解层次聚类的核心思想和实际操作。

注:本文章含大量数学算式、详细例子说明及代码演示,大量干货,建议先收藏再慢慢观看理解。新频道发展不易,你们的每个赞、收藏跟转发都是我继续分享的动力!


一、层次聚类的基本流程

我们先要知道聚类的种类:

  • 凝聚型(Agglomerative):每个点单独为一类,逐步合并最近的两类,直到只剩一个大类或达到预设簇数。

  • 分裂型(Divisive):所有点先是一类,逐步分裂成更小的簇,直到每个点单独成类或达到预设簇数。

实际应用中,凝聚型更常用。在这篇文章,我们也会预设使用凝聚型。相信大家在搞明白凝聚型后,也能举一反三,知道分裂型是怎么运作的!


二、距离度量与四大链接法

1. 单链法(Single Linkage)

d_{\text{single}}(A, B) = \min_{x \in A, y \in B} \|x - y\|

2. 全链法(Complete Linkage)

d_{\text{complete}}(A, B) = \max_{x \in A, y \in B} \|x - y\|

3. 平均法(Average Linkage)

d_{\text{average}}(A, B) = \frac{1}{|A||B|} \sum_{x \in A} \sum_{y \in B} \|x - y\|

4. 中心法(Centroid Linkage)

d_{\text{centroid}}(A, B) = \|\mu_A - \mu_B\|

其中 $\mu_A$$\mu_B$ 分别为簇 $A$$B$ 的均值。


三、案例数据

假设有5个样本点:A、B、C、D、E,欧氏距离矩阵(Euclidean Distance Matrix)如下:
基本上,表格的数字就是代表该点于目标点的绝对距离差异(标量)。

ABCDE
A026109
B20598
C65045
D109403
E98530

四、四大链接法的完整流程

1. 单链法(Single Linkage)流程

Step 1:初始化

每个点为一类:${A}, {B}, {C}, {D}, {E}$

Step 2:第一次合并
  • 距离最小为A-B=2,合并${A}$${B}$${A,B}$

Step 3:更新距离
  • ${A,B}$和C:$\min(6,5)=5$

  • ${A,B}$和D:$\min(10,9)=9$

  • ${A,B}$和E:$\min(9,8)=8$

ABCDE
AB0598
C5045
D9403
E8530
Step 4:第二次合并
  • D-E=3,合并为${D,E}$

Step 5:更新距离
  • ${D,E}$和C:$\min(4,5)=4$

  • ${D,E}$和AB:$\min(9,8)=8$

ABCDE
AB058
C504
DE840
Step 6:第三次合并
  • C-DE=4,合并为${C,D,E}$

Step 7:更新距离
  • ${C,D,E}$和AB:$\min(5,9,8)=5$

ABCDE
AB05
CDE50
Step 8:最后合并
  • AB与CDE合并,距离为5。


2. 全链法(Complete Linkage)流程

Step 1:初始化

同上。

Step 2:第一次合并
  • A-B=2,合并${A,B}$

Step 3:更新距离
  • ${A,B}$和C:$\max(6,5)=6$

  • ${A,B}$和D:$\max(10,9)=10$

  • ${A,B}$和E:$\max(9,8)=9$

ABCDE
AB06109
C6045
D10403
E9530
Step 4:第二次合并
  • D-E=3,合并${D,E}$

Step 5:更新距离
  • ${D,E}$和C:$\max(4,5)=5$

  • ${D,E}$和AB:$\max(10,9)=10$

ABCDE
AB0610
C605
DE1050
Step 6:第三次合并
  • C-DE=5,合并${C,D,E}$

Step 7:更新距离
  • ${C,D,E}$和AB:$\max(6,10,9)=10$

ABCDE
AB010
CDE100
Step 8:最后合并
  • AB与CDE合并,距离为10。


3. 平均法(Average Linkage)流程

Step 1:初始化

同上。

Step 2:第一次合并
  • A-B=2,合并${A,B}$

Step 3:更新距离
  • ${A,B}$和C:$(6+5)/2=5.5$

  • ${A,B}$和D:$(10+9)/2=9.5$

  • ${A,B}$和E:$(9+8)/2=8.5$

ABCDE
AB05.59.58.5
C5.5045
D9.5403
E8.5530
Step 4:第二次合并
  • D-E=3,合并${D,E}$

Step 5:更新距离
  • ${D,E}$和C:$(4+5)/2=4.5$

  • ${D,E}$和AB:$(9.5+8.5)/2=9.0$

ABCDE
AB05.59.0
C5.504.5
DE9.04.50
Step 6:第三次合并
  • C-DE=4.5,合并${C,D,E}$

Step 7:更新距离
  • ${C,D,E}$和AB:$(5.5+9.0)/2=7.25$

ABCDE
AB07.25
CDE7.250
Step 8:最后合并
  • AB与CDE合并,距离为7.25。


4. 中心法(Centroid Linkage)流程

Step 1:初始化

同上。

Step 2:第一次合并
  • A-B=2,合并${A,B}$,中心为$(A+B)/2$

Step 3:更新距离
  • 计算${A,B}$中心与C、D、E的距离。

    • 假设A=(25,30), B=(27,32),则中心为(26,31)

    • C=(45,80),D=(46,82),E=(30,31)

    • $|{A,B}_{\text{center}} - C| = \sqrt{(45-26)^2 + (80-31)^2} = \sqrt{361+2401}=52.2$(实际数值可用原始数据或距离矩阵近似)

    • 由于原始数据未给出,这里示意:每次合并后,重新计算所有新簇中心与其他簇中心的距离。

Step 4:重复合并与更新
  • 每次都用新簇中心与其他簇中心的距离决定下一个合并对象。

  • 该方法可能出现“逆转”现象,即两个簇合并后与其他簇的距离变小。


五、可视化与解读

  • 每次合并的距离可画在树状图(dendrogram)上,横轴为样本,纵轴为合并距离。

  • “剪断”树状图某一高度,即可得到不同数量的簇。


六、代码演示(四大链接法)

下面是完整代码,所有方法都用同一组一维点(方便与距离矩阵对应),并分别绘制每种链接方式的树状图(dendrogram),适合直接运行和学习。

数据都是根据上面的流程去描述的,有看不懂的地方可以留言问我!

注:请在本地运行,还有记得要先安装适当的Library再运行喔~

import numpy as np
from scipy.cluster.hierarchy import linkage, dendrogram
import matplotlib.pyplot as plt

# 案例数据:用一维点模拟距离矩阵
# 实际距离矩阵为:
# |   | A | B | C | D | E |
# |---|---|---|---|---|---|
# | A | 0 | 2 | 6 |10 | 9 |
# | B | 2 | 0 | 5 | 9 | 8 |
# | C | 6 | 5 | 0 | 4 | 5 |
# | D |10 | 9 | 4 | 0 | 3 |
# | E | 9 | 8 | 5 | 3 | 0 |

labels = ['A', 'B', 'C', 'D', 'E']
# 用一维坐标近似上述距离关系
points = np.array([[0], [2], [6], [10], [9]])

# 单链法(Single Linkage)
Z_single = linkage(points, method='single')
plt.figure(figsize=(8, 4))
dendrogram(Z_single, labels=labels)
plt.title('Dendrogram - Single Linkage')
plt.xlabel('Sample')
plt.ylabel('Distance')
plt.show()

# 全链法(Complete Linkage)
Z_complete = linkage(points, method='complete')
plt.figure(figsize=(8, 4))
dendrogram(Z_complete, labels=labels)
plt.title('Dendrogram - Complete Linkage')
plt.xlabel('Sample')
plt.ylabel('Distance')
plt.show()

# 平均法(Average Linkage)
Z_average = linkage(points, method='average')
plt.figure(figsize=(8, 4))
dendrogram(Z_average, labels=labels)
plt.title('Dendrogram - Average Linkage')
plt.xlabel('Sample')
plt.ylabel('Distance')
plt.show()

# 中心法(Centroid Linkage)
Z_centroid = linkage(points, method='centroid')
plt.figure(figsize=(8, 4))
dendrogram(Z_centroid, labels=labels)
plt.title('Dendrogram - Centroid Linkage')
plt.xlabel('Sample')
plt.ylabel('Distance')
plt.show()

注:关掉一个,下一个就会自动弹出喔。


七、业务应用与建议

  • 单链法:适合发现细长簇,对噪声敏感,易链式效应。

  • 全链法:适合发现紧密小簇,对异常值鲁棒。

  • 平均法:聚类效果平衡,常用。

  • 中心法:适合数据均匀分布,解释性强,但可能逆转。

实际项目中,建议多种链接法对比,结合业务需求和树状图可视化,灵活选择合适方案。


八、总结

层次聚类是一种经典且直观的无监督聚类方法,能够揭示数据的多层次结构。通过不同的链接法(单链法、全链法、平均法、中心法),我们可以根据实际需求和数据特性灵活选择合适的聚类策略。

在实际项目中,建议结合多种链接法的结果、业务需求和树状图(dendrogram)可视化,灵活确定最终簇数和聚类方案。对于大规模数据,层次聚类适合先降维或采样后使用;对于小样本、需要可解释性的任务,层次聚类是极佳选择。

希望本篇内容能帮助你彻底理解层次聚类的原理、流程与实际操作,为你的数据分析和业务决策提供有力工具。下期我们将继续探索更多机器学习实战主题,敬请期待!


谢谢你看到这里,你们的每个赞、收藏跟转发都是我继续分享的动力

我是爱酱,我们下次再见,谢谢收看!

### 如何根据相似度矩阵绘制单链层次聚类的树状图 在 Python 中实现基于相似度矩阵的单链(Single Linkage)层次聚类并绘制树状图的过程可以通过 `scipy` 库完成。以下是具体的方: #### 使用相似度矩阵生成单链层次聚类 为了使用相似度矩阵进行单链层次聚类,需将其转换为距离矩阵形式,因为大多数层次聚类函数接受的是距离而非相似度作为输入。假设我们有一个相似度矩阵 \( S \),其中 \( S[i][j] \) 表示样本 \( i \) 样本 \( j \) 的相似度,则可通过以下方式定义距离矩阵 \( D \)[^3]: \[ D[i][j] = 1 - S[i][j] \] 如果相似度范围不在 [0, 1],则可能需要对其进行归一化处理。 #### 实现代码 下面是一个完整的代码示例,展示如何利用相似度矩阵执行单链层次聚类并绘制树状图: ```python import numpy as np from scipy.spatial.distance import squareform from scipy.cluster.hierarchy import linkage, dendrogram import matplotlib.pyplot as plt # 假设这是我们的相似度矩阵 (Symmetric Matrix) similarity_matrix = np.array([ [1.0, 0.7, 0.2], [0.7, 1.0, 0.4], [0.2, 0.4, 1.0] ]) # 将相似度矩阵转换为距离矩阵 distance_matrix = 1 - similarity_matrix # 这里假定相似度取值范围为[0, 1] # 层次聚类要求的距离矩阵应是一维压缩形式 condensed_distance_matrix = squareform(distance_matrix) # 执行单链层次聚类 Z = linkage(condensed_distance_matrix, 'single') # 可视化树状图 plt.figure(figsize=(8, 4)) dendrogram(Z) plt.title('Dendrogram of Single Linkage Hierarchical Clustering') plt.xlabel('Sample Index') plt.ylabel('Distance') plt.show() ``` 此代码片段展示了如何从给定的相似度矩阵出发,经过一系列变换终得到单链层次聚类的结果,并以树状图的形式呈现[^1]。 #### 关键点解释 - **相似度转距离**:由于许多聚类算法依赖于距离的概念,因此当提供的是相似度时,通常会通过简单的线性映射来获得相应的距离表示。 - **Squareform 函数的作用**:它能够把对称方阵型的距离/相似度表转化为紧凑的一维数组形式,这种格式正是 `linkage()` 方所期望接收的数据布局。 - **Linkage 参数设置**:这里选择了 `'single'` 方参数指定采用单一连接策略来进行层次聚类操作[^3]。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值