系统聚类思想及其Python实现

发布时间 2023-12-17 23:18:06作者: 郝hai

系统聚类是一种将对象或数据按照其相似性进行分组的方法。与传统聚类方法不同,系统聚类通过构建一颗层次树(或称为树状图或谱系图)来展现数据的层次结构。在系统聚类中,数据点最初被视为单独的簇,然后通过逐步合并或分裂,形成一个层次结构的聚类结果。这种层次结构可用于分析数据的不同层次的相似性关系。系统聚类常用于生物学、分类学、社会网络等领域,其中对于数据之间的演化或关联关系的理解十分重要。系统聚类的结果可通过树状图直观地展示,为研究者提供了对数据结构和组织的更深层次的认识。在进行机器学习时,往往要把相似的样品点/数据点进行归类,相似度高的样品点会放在一起,这样一个样本就会被分成几类。而聚类分析也有很多种方法,比如分解法、加入法、有序样品的聚类、模糊聚类法以及系统聚类法等。这里学习系统聚类法,以及如何用python来进行系统聚类分析。

一、系统聚类的思想

系统聚类法(hierarchical clustering method),又叫分层聚类法,是目前最常用的聚类分析方法。其基本步骤如下:假设样本中有n个样品,那么就先将这n个样品看作n类,也就是一个样品一个类,然后将性质最接近的两类合并为一个新的类,这样就得到n-1个类,接着从中再找出最接近的两个类,让其进行合并,这样就变为n-2个类,让此过程持续进行下去,最后所有的样品都归为一类,把上述过程绘制成一张图,这个图就称为聚类图,从图中再决定分为多少类。其大致过程如下图所示。

1.1 样本之间的常用距离

  • 绝对值距离: \(\mathrm{d}\left(\overrightarrow{\mathrm{x}_{\mathrm{i}}}, \overrightarrow{\mathrm{x}_{\mathrm{j}}}\right)=\sum_{\mathrm{k}=1}^{\mathrm{p}}\left|\mathrm{x}_{\mathrm{ik}}-\mathrm{x}_{\mathrm{jk}}\right|\)
  • 欧式距离: \(d\left(\vec{x}_i, \overrightarrow{x_j}\right)=\sqrt{\sum_{k=1}^p\left(x_{i k}-x_{j k}\right)^2}\)
  • Minkowski距离: \(d\left(\overrightarrow{x_i}, \overrightarrow{x_j}\right)=\left[\sum_{k=1}^p\left(x_{i k}-x_{j k}\right)^q\right]^{\frac{1}{q}}\)
  • Chebyshev距离: \(d\left(\overrightarrow{x_i}, \overrightarrow{x_j}\right)=\max _{1 \leq k \leq p}\left|x_{i k}-x_{j k}\right|\)
  • 马氏距离: \(\mathrm{d}\left(\overrightarrow{\mathrm{x}_{\mathrm{i}}}, \overrightarrow{\mathrm{x}_{\mathrm{j}}}\right)=\left(\overrightarrow{\mathrm{x}_{\mathrm{i}}}, \overrightarrow{\mathrm{x}_{\mathrm{j}}}\right)^{\prime} \sum^{-1}\left(\overrightarrow{\mathrm{x}_{\mathrm{i}}}, \overrightarrow{\mathrm{x}_{\mathrm{j}}}\right)\)其中: \(\vec{x}_{\mathrm{i}}=\left(\mathrm{x}_{\mathrm{i} 1}, \mathrm{x}_{\mathrm{i} 2}, \ldots, \mathrm{x}_{\mathrm{ip}}\right)^{\prime}, \quad \overrightarrow{\mathrm{x}}_{\mathrm{j}}=\left(\mathrm{x}_{\mathrm{j} 1}, \mathrm{x}_{\mathrm{j} 2}, \ldots, \mathrm{x}_{\mathrm{jp}}\right)^{\prime}\)

1.2 类类间的距离

最短距离法(SINGLE):两类间距离的最小者

\[D_{p q}=\min _{i \in G_p, j \in G_q} d_{i j} \]

递推公式:

\[D_{r k}=\min \left\{D_{p k}, D_{q k}\right\} \]

系统聚类方法的递推公式可以统一为:

\[D_{r k}^2=\alpha_p D_{p k}^2+\alpha_q D_{q k}^2+\beta D_{p q}^2+\gamma\left|D_{p k}^2-D_{q k}^2\right| \]

方法 \(\alpha_p\) \(\alpha_q\) \(\beta\) \(\gamma\)
最短距离法(single linkage method) \(1/ 2\) \(1 / 2\) 0 \(-1/2\)
最长距离法(complete linkage method) \(1/ 2\) \(1 / 2\) 0 \(1/2\)
中间距离法(median method) \(1/ 2\) \(1 / 2\) \(-1/4\) 0
重心法(centroid hierarchical method) \(n_p / n_r\) \(n_q / n_r\) \(-\alpha_p \alpha_q\) 0
类平均法(Group average method) \(n_p / n_r\) \(n_q / n_r\) 0 0
可变类平均 \((1-\beta) n_p / n_r\) \((1-\beta) n_q / n_r\) \(\beta(<1)\) 0
可变法 \((1-\beta) / 2\) \((1-\beta) / 2\) \(\beta(<1)\) 0
离差平方和(ward method) \(\left(n_p+n_k\right) /\left(n_r+n_k\right)\) \(\left(n_q+n_k\right) /\left(n_r+n_k\right)\) \(-n_k /\left(n_k+n_r\right)\) 0

二、系统聚类的算例

根据五个学生的六门课的成绩,对这五个学生进行分类。

ID 数学 物理 化学 语文 历史 英语
1 65 61 72 84 81 79
2 77 77 76 64 70 55
3 67 63 49 65 67 57
4 80 69 75 74 74 63
5 74 70 80 84 81 74
  • 写出样品间的距离矩阵(以欧氏距离为例)

\[D_0=\left[\begin{array}{ccccc} 0 & & & & \\ 38.9 & 0 & & & \\ 39.7 & 32.2 & 0 & & \\ 26.5 & 15.9 & 32.4 & 0 & \\ 15.8 & 30.9 & 43.6 & 18.2 & 0 \end{array}\right] \begin{aligned} & G_1 \\ & G_2 \\ & G_3 \\ & G_4 \end{aligned} \]

  • 将每一个样品看做是一个类,即 \(\mathrm{G} 1, \mathrm{G} 2, \mathrm{G} 3, \mathrm{G} 4, \mathrm{G} 5\) 。观察 \(D(\mathrm{G} 1, \mathrm{G} 5)=15.8\) 最小,故将 \(\mathrm{G} 1\)\(\mathrm{G} 5\) 聚为一类,记为 G6。计算新类与其余各类之间的距离,得到新的距离矩阵D1。

\[\begin{aligned} & D\left(G_6, G_2\right)=\min \left\{D\left(G_1, G_2\right), D\left(G_5, G_2\right)\right\}=\min \{38.9,30.9\}=30.9 \\ & D\left(G_6, G_3\right)=\min \left\{D\left(G_1, G_3\right), D\left(G_5, G_3\right)\right\}=\min \{39.7,43.6\}=39.7 \\ & D\left(G_6, G_4\right)=\min \left\{D\left(G_1, G_4\right), D\left(G_5, G_4\right)\right\}=\min \{26.5,18.2\}=18.2 \\ & D_1=\left[\begin{array}{cccc} 0 & & & \\ 30.9 & 0 & & \\ 39.7 & 32.2 & 0 & \\ 18.2 & 15.9 & 32.4 & 0 \end{array}\right] G_6 \\ & \end{aligned} \]

  • 观察 \(D(G 2, G 4)=15.9\) 最小,故将G2与G4聚为一类,记为 \(G 7\) 。计算新类与其余各类之间的距离,得到新的距离矩阵 D2。

\[\begin{gathered} D\left(G_7, G_6\right)=\min \left\{D\left(G_2, G_6\right), D\left(G_4, G_6\right)\right\}=\min \{30.9,18.2\}=18.2 \\ D\left(G_7, G_3\right)=\min \left\{D\left(G_2, G_3\right), D\left(G_4, G_3\right)\right\}=\min \{32.2,32.4\}=32.2 \\ D_2=\left[\begin{array}{ccc} 0 & \\ 18.2 & 0 & G_7 \\ 32.2 & 39.7 & 0 \end{array}\right] \begin{array}{l} G_6 \\ G_3 \end{array} \end{gathered} \]

  • 观察 \(D(G 6, G 7)=18.2\) 最小,故将G6与G7聚为一类,记为 \(G 8\) 。计算新类与其余各类之间的距离,得到新的距离矩阵 D3。

\[\begin{gathered} D\left(G_8, G_3\right)=\min \left\{D\left(G_6, G_3\right), D\left(G_7, G_3\right)\right\}=\min \{39.7,32.2\}=32.2 \\ D_3=\left[\begin{array}{cc} 0 & \\ 32.2 & 0 \end{array}\right] G_8 \end{gathered} \]

  • 最后将 \(G 8\)\(G 3\) 聚为一类, 记为 \(G 9\)

三、系统的聚类的Python实现

import pandas as pd
from scipy.cluster.hierarchy import linkage, fcluster, dendrogram
import matplotlib.pyplot as plt

# 读取 country.csv 文件,见文中最后数据文件结构
X = pd.read_csv('country.csv', encoding='utf-8')

# 选择只包含数值型数据的列
numeric_cols = X.select_dtypes(include=['number']).columns
X_numeric = X[numeric_cols]

# 进行层次聚类
Z = linkage(X_numeric, method='ward')  # 选择层次聚类的方法,这里使用Ward方法

#通过树状图可视化层次聚类结果
plt.figure(figsize=(15, 8))
dendrogram(Z)
plt.title('Hierarchical Clustering Dendrogram')
plt.xlabel('Sample Index')
plt.ylabel('Distance')
plt.show()

#根据树状图的切割高度,确定聚类簇的数量
cut_height = 300  # 根据实际情况调整
clusters = fcluster(Z, t=cut_height, criterion='distance')

#输出聚类结果
X['Cluster'] = clusters
print(X.head())

总结

系统聚类方法是一种将数据按照层次结构进行分组的聚类技术。其基本思想是通过构建一颗层次树,根据数据点之间的相似性逐步合并或分裂簇,形成层次化的聚类结果。系统聚类方法在生物学、分类学、社会网络分析等领域有广泛应用。在生物学中,系统聚类可用于分析物种的进化关系,揭示基因或蛋白质的功能相似性。在分类学中,它帮助研究者理解不同类别之间的关系。在社会网络分析中,系统聚类揭示了不同社群之间的联系,有助于理解网络结构和社会组织。系统聚类方法通过提供层次结构的视角,使得对数据的更深入理解成为可能,为各个领域的研究提供了有力工具。

参考文献

  1. 系统(层次)聚类原理详解及案例分析
  2. 层次聚类法应用实例及Python实现
  3. 原理+代码|详解层次聚类及Python实现

用层次聚类法对世界20个国家和地区进行聚类,具体数据country.csv如下:

country

call

movecall

fee

computer

mips

net

1

美  国

631.60

161.90

0.36

403.00

26073.00

35.34

2

日  本

498.40

143.20

3.57

176.00

10223.00

6.26

3

德  国

557.60

70.60

2.18

199.00

11571.00

9.48

4

瑞  典

684.10

281.80

1.40

286.00

16660.00

29.39

5

瑞  士

644.00

93.50

1.98

234.00

13621.00

22.68

6

丹  麦

620.30

248.60

2.56

296.00

17210.00

21.84

7

新加坡

498.40

147.50

2.50

284.00

13578.00

13.49

8

中国台湾

469.40

56.10

3.68

119.00

6911.00

1.72

9

韩  国

434.50

73.00

3.36

99.00

5795.00

1.68

10

巴  西

81.90

16.30

3.02

19.00

876.00

0.52

11

智  利

138.60

8.20

1.40

31.00

1411.00

1.28

12

墨西哥

92.20

9.80

2.61

31.00

1751.00

0.35

13

俄罗斯

174.90

5.00

5.12

24.00

1101.00

0.48

14

波  兰

169.00

6.50

3.68

40.00

1796.00

1.45

15

匈牙利

262.20

49.40

2.66

68.00

3067.00

3.09

16

马来西亚

195.50

88.40

4.19

53.00

2734.00

1.25

17

泰  国

78.60

27.80

4.95

22.00

1662.00

0.11

18

印  度

13.60

0.30

6.28

2.00

101.00

0.01

19

法  国

559.10

42.90

1.27

201.00

11702.00

4.76

20

英  国

521.10

122.50

0.98

248.00

14461.00

11.91