大家好,我是爱酱。本期我们将用详细案例和流程,分别演示单链法、全链法、平均法和中心法四种主流链接方式的层次聚类。每种方法都配有具体合并步骤、距离计算和结果解读,帮助新手和进阶读者彻底理解层次聚类的核心思想和实际操作。
注:本文章含大量数学算式、详细例子说明及代码演示,大量干货,建议先收藏再慢慢观看理解。新频道发展不易,你们的每个赞、收藏跟转发都是我继续分享的动力!
一、层次聚类的基本流程
我们先要知道聚类的种类:
-
凝聚型(Agglomerative):每个点单独为一类,逐步合并最近的两类,直到只剩一个大类或达到预设簇数。
-
分裂型(Divisive):所有点先是一类,逐步分裂成更小的簇,直到每个点单独成类或达到预设簇数。
实际应用中,凝聚型更常用。在这篇文章,我们也会预设使用凝聚型。相信大家在搞明白凝聚型后,也能举一反三,知道分裂型是怎么运作的!
二、距离度量与四大链接法
1. 单链法(Single Linkage)
2. 全链法(Complete Linkage)
3. 平均法(Average Linkage)
4. 中心法(Centroid Linkage)
其中 、
分别为簇
和
的均值。
三、案例数据
假设有5个样本点:A、B、C、D、E,欧氏距离矩阵(Euclidean Distance Matrix)如下:
基本上,表格的数字就是代表该点于目标点的绝对距离差异(标量)。
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 |
四、四大链接法的完整流程
1. 单链法(Single Linkage)流程
Step 1:初始化
每个点为一类:
Step 2:第一次合并
-
距离最小为A-B=2,合并
和
为
Step 3:更新距离
-
和C:
-
和D:
-
和E:
AB | C | D | E | |
---|---|---|---|---|
AB | 0 | 5 | 9 | 8 |
C | 5 | 0 | 4 | 5 |
D | 9 | 4 | 0 | 3 |
E | 8 | 5 | 3 | 0 |
Step 4:第二次合并
-
D-E=3,合并为
Step 5:更新距离
-
和C:
-
和AB:
AB | C | DE | |
---|---|---|---|
AB | 0 | 5 | 8 |
C | 5 | 0 | 4 |
DE | 8 | 4 | 0 |
Step 6:第三次合并
-
C-DE=4,合并为
Step 7:更新距离
-
和AB:
AB | CDE | |
---|---|---|
AB | 0 | 5 |
CDE | 5 | 0 |
Step 8:最后合并
-
AB与CDE合并,距离为5。
2. 全链法(Complete Linkage)流程
Step 1:初始化
同上。
Step 2:第一次合并
-
A-B=2,合并
Step 3:更新距离
-
和C:
-
和D:
-
和E:
AB | C | D | E | |
---|---|---|---|---|
AB | 0 | 6 | 10 | 9 |
C | 6 | 0 | 4 | 5 |
D | 10 | 4 | 0 | 3 |
E | 9 | 5 | 3 | 0 |
Step 4:第二次合并
-
D-E=3,合并
Step 5:更新距离
-
和C:
-
和AB:
AB | C | DE | |
---|---|---|---|
AB | 0 | 6 | 10 |
C | 6 | 0 | 5 |
DE | 10 | 5 | 0 |
Step 6:第三次合并
-
C-DE=5,合并
Step 7:更新距离
-
和AB:
AB | CDE | |
---|---|---|
AB | 0 | 10 |
CDE | 10 | 0 |
Step 8:最后合并
-
AB与CDE合并,距离为10。
3. 平均法(Average Linkage)流程
Step 1:初始化
同上。
Step 2:第一次合并
-
A-B=2,合并
Step 3:更新距离
-
和C:
-
和D:
-
和E:
AB | C | D | E | |
---|---|---|---|---|
AB | 0 | 5.5 | 9.5 | 8.5 |
C | 5.5 | 0 | 4 | 5 |
D | 9.5 | 4 | 0 | 3 |
E | 8.5 | 5 | 3 | 0 |
Step 4:第二次合并
-
D-E=3,合并
Step 5:更新距离
-
和C:
-
和AB:
AB | C | DE | |
---|---|---|---|
AB | 0 | 5.5 | 9.0 |
C | 5.5 | 0 | 4.5 |
DE | 9.0 | 4.5 | 0 |
Step 6:第三次合并
-
C-DE=4.5,合并
Step 7:更新距离
-
和AB:
AB | CDE | |
---|---|---|
AB | 0 | 7.25 |
CDE | 7.25 | 0 |
Step 8:最后合并
-
AB与CDE合并,距离为7.25。
4. 中心法(Centroid Linkage)流程
Step 1:初始化
同上。
Step 2:第一次合并
-
A-B=2,合并
,中心为
Step 3:更新距离
-
计算
中心与C、D、E的距离。
-
假设A=(25,30), B=(27,32),则中心为(26,31)
-
C=(45,80),D=(46,82),E=(30,31)
-
(实际数值可用原始数据或距离矩阵近似)
-
由于原始数据未给出,这里示意:每次合并后,重新计算所有新簇中心与其他簇中心的距离。
-
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)可视化,灵活确定最终簇数和聚类方案。对于大规模数据,层次聚类适合先降维或采样后使用;对于小样本、需要可解释性的任务,层次聚类是极佳选择。
希望本篇内容能帮助你彻底理解层次聚类的原理、流程与实际操作,为你的数据分析和业务决策提供有力工具。下期我们将继续探索更多机器学习实战主题,敬请期待!
谢谢你看到这里,你们的每个赞、收藏跟转发都是我继续分享的动力。
我是爱酱,我们下次再见,谢谢收看!