系统聚类是一种将对象或数据按照其相似性进行分组的方法。与传统聚类方法不同,系统聚类通过构建一颗层次树(或称为树状图或谱系图)来展现数据的层次结构。在系统聚类中,数据点最初被视为单独的簇,然后通过逐步合并或分裂,形成一个层次结构的聚类结果。这种层次结构可用于分析数据的不同层次的相似性关系。系统聚类常用于生物学、分类学、社会网络等领域,其中对于数据之间的演化或关联关系的理解十分重要。系统聚类的结果可通过树状图直观地展示,为研究者提供了对数据结构和组织的更深层次的认识。在进行机器学习时,往往要把相似的样品点/数据点进行归类,相似度高的样品点会放在一起,这样一个样本就会被分成几类。而聚类分析也有很多种方法,比如分解法、加入法、有序样品的聚类、模糊聚类法以及系统聚类法等。这里学习系统聚类法,以及如何用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 |
- 写出样品间的距离矩阵(以欧氏距离为例)
- 将每一个样品看做是一个类,即 \(\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。
- 观察 \(D(G 2, G 4)=15.9\) 最小,故将G2与G4聚为一类,记为 \(G 7\) 。计算新类与其余各类之间的距离,得到新的距离矩阵 D2。
- 观察 \(D(G 6, G 7)=18.2\) 最小,故将G6与G7聚为一类,记为 \(G 8\) 。计算新类与其余各类之间的距离,得到新的距离矩阵 D3。
- 最后将 \(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())
总结
系统聚类方法是一种将数据按照层次结构进行分组的聚类技术。其基本思想是通过构建一颗层次树,根据数据点之间的相似性逐步合并或分裂簇,形成层次化的聚类结果。系统聚类方法在生物学、分类学、社会网络分析等领域有广泛应用。在生物学中,系统聚类可用于分析物种的进化关系,揭示基因或蛋白质的功能相似性。在分类学中,它帮助研究者理解不同类别之间的关系。在社会网络分析中,系统聚类揭示了不同社群之间的联系,有助于理解网络结构和社会组织。系统聚类方法通过提供层次结构的视角,使得对数据的更深入理解成为可能,为各个领域的研究提供了有力工具。
参考文献
用层次聚类法对世界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 |