首页 > 编程语言 >系统聚类思想及其Python实现

系统聚类思想及其Python实现

时间:2023-12-17 23:22:22浏览次数:42  
标签:right overrightarrow 思想 min Python 聚类 mathrm left

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

标签:right,overrightarrow,思想,min,Python,聚类,mathrm,left
From: https://www.cnblogs.com/haohai9309/p/17909741.html

相关文章

  • Python——作图
    Python——作图百分比堆积柱状图importmatplotlib.pyplotaspltimportnumpyasnp#定义数据categories=['CatA','CatB','CatC']values1=[20,30,15]values2=[10,25,20]values3=[5,10,15]#将数据转化为相对百分比total=np.array(v......
  • Python: Random
     #encoding:utf-8#版权所有2023涂聚文有限公司#许可信息查看:#描述:https://docs.python.org/3/library/string.html#Author:geovindu,GeovinDu涂聚文.#IDE:PyCharm2023.1python3.11#Datetime:2023/12/1718:16#User:geovindu#P......
  • python常用内置模块(持续更新中)
    random模块相关方法需要掌握的,未提及的建议自行了解importrandom大于0且小于1之间的小数(不含1)random.random()#0.38916016381720087指定区间指定start到end(不含end)之间的随机小数random.uniform(0,10)#8.080921224222864指定区间指定start到end(含end)之......
  • Python模块与包
    【一】模块的介绍【1】什么是模块在Python中,一个py文件就是一个模块,文件名为xxx.py模块名则是xxx,导入模块可以引用模块中已经写好的功能。如果把开发程序比喻成制造一台电脑编写模块就像是在制造电脑的零部件准备好零部件后,剩下的工作就是按照逻辑把它们组装到一起。将......
  • Python迭代器和生成器
    【一】迭代器介绍迭代器即用来迭代取值的工具,而迭代是重复反馈过程的活动其目的通常是为了逼近所需的目标或结果,每一次对过程的重复称为一次“迭代”而每一次迭代得到的结果会作为下一次迭代的初始值,单纯的重复并不是迭代whileTrue:msg=input(">>:").strip()......
  • python 浮点数 round 舍一法 向零取整 df 数组 Series 三种数据类型实现
    介绍:python的round函数,默认进行四舍五入,我需要将3.45保留一位小数,3.4 一、一般格式使用Python的内置函数 math.floor() 来向下取整到指定的小数位数。例如,如果你想保留小数点后一位并向下取整,可以这样做:importmathnum=3.45rounded_num=math.floor(num*10)/......
  • 《Java编程思想第四版》学习笔记48--关于Runnable
    现在run()位于类内,但它在init()结束以后仍处在“睡眠”状态。若按下启动按钮,线程便会用多少有些暧昧的表达方式创建(若线程尚不存在):newThread(Counter3.this);若某样东西有一个Runnable接口,实际只是意味着它有一个run()方法,但不存在与之相关的任何特殊东西——它不具有任何天......
  • Python算法——二叉树遍历
    Python中的二叉树遍历算法详解二叉树是一种常见的树状数据结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。遍历二叉树是访问树的所有节点并按照特定顺序输出它们的过程。在本文中,我们将讨论二叉树的三种主要遍历算法:前序遍历、中序遍历和后序遍历,并提供相应的Python代码......
  • 【python常用模块之time时间模块】---时间模块(time/datetime)
    title:【python常用模块之time时间模块】---时间模块(time/datetime)date:2023-12-1716:54:06updated:2023-12-1717:00:00description:【python常用模块之time时间模块】---时间模块(time/datetime)cover:https://home.cnblogs.com/u/dream-ze/【一】时间模......
  • 【python入门之OS模块介绍】---OS模块介绍
    title:【python入门之OS模块介绍】---OS模块介绍date:2023-12-1615:54:06updated:2023-12-1616:20:00description:【python入门之OS模块介绍】---OS模块介绍cover:https://home.cnblogs.com/u/dream-ze/【一】OS模块的介绍os模块是Python编程语言中......