层次聚类算法
层次聚类是一种常用的无监督学习方法,用于将数据集中的样本按照相似性进行分组或聚类。与其他聚类算法不同的是,层次聚类不需要事先指定要分成多少个簇,而是通过逐步合并或划分样本来构建一个层次结构,从而形成一棵聚类树(也称为树状图或谱系图)。
层次聚类可以分为两种主要类型:凝聚型(自底向上)和分裂型(自顶向下)。
-
凝聚型层次聚类(Agglomerative Clustering)从每个样本作为一个独立的簇开始,然后迭代地合并最接近的簇,直到满足某个停止条件。这个过程通过计算样本之间的相似度(如欧氏距离、余弦相似度等)来确定簇的合并顺序。
-
分裂型层次聚类(Divisive Clustering)则相反,它从所有样本作为一个簇开始,然后迭代地将簇逐步分裂为更小的子簇,直到满足某个停止条件。这个过程通过计算样本之间的差异度来确定簇的分裂顺序。
本文主要研究凝聚型层次聚类算法(Agglomerative Clustering)
层次聚类的结果可以通过树状图展示,树中的每个节点代表一个簇或子簇。根据需要,可以通过剪枝来选择最终的聚类簇数。
层次聚类的优点是不需要预先指定簇的数量,并且能够提供更详细的聚类结构信息。然而,层次聚类的计算复杂度较高,尤其是对于大规模数据集而言。此外,由于聚类过程中的合并或分裂决策是基于样本之间的相似性度量,因此对数据质量和相似性度量的选择十分重要。
凝聚型层次聚类(Agglomerative Clustering)
层次聚类的合并算法通过计算两类数据点间的相似性,对所有数据点中最为相似的两个数据点进行组合,并反复选代这一过程。简单的说层次聚类的合并算法是通过计算每一个类别的数据点与所有数据点之间的距离来确定它们之间的相似性,距离越小,相似度越高。并将距离最近的两个数据点或类别进行组合,生成聚类树。
相似度的计算
层次聚类使用欧式距离来计算不同类别数据点间的距离(相似度)
实例1
数据点如下:
对于以上的数据点,计算各点之间的欧氏距离,得到一个距离矩阵:
找出该矩阵中,除了自己到自己之外的距离的最小值。如上图中,C到B的值为1,是所有距离中最小的,因此,就把B和C组合在一起。
将数据点B与数据点C进行组合后,重新计算各类别数据点间的距离知阵。数据点间的距离计算方式与之前的方法一样。
这里需要说明的是组合数据点(B,C)与其他数据点间的计算方法。当我们计算(B,C)到A的距离时,需要分别计算B到A和C到A的距离均值。
经过计算数据点D到数据点E的距离在所有的距离值中最小,为1.20。这表示在当前的所有数据点中(包含组合数据点),D和E的相似度最高。因此我们将教据点
D和数据点E进行组合。并再次计算其他数据点间的距离。
后面的工作就是不断的重复计算数据点与数据点,数据点与组合数据点间的距离。这个步骤应该由程序来完成。这里由于数据量较小,我们手工计算并列出每一步的距离计算和数据点组合的结果。
两个组合数据点间的距离
计算两个组合数据点间距离的方法有三种,分别为Single Linkage,Complete Linkae和Average Linkage。在开始计算之前,我们先来介绍下这三种计算方法以及各自的优缺点。
- Single Linkage: 方法是将两个组合数据点中距离最近的两个数据点间的距离作为这两个组合数据点的距离。这种方法容易受到极端值的影响。两个很相似的组合数据点可能由于其中的某个极端的数据点距离较近而组合在一起。
- Complete Linkage: Complete Linkage的计算方法与Sinole Linkage相反,将两个组合数据点中距离最远的两个数据点间的距离作为这两个组合数据点的距离。Complete Linkage的问题也与Sindle Linkage相反,两个不相似的组合数据点可能由于其中的极端值距离较远而无法组合在一起。
- Average Linkage:Average Likae的计算方法是计算两个组合数据点中的每个数据点与其他所有数据点的距离。将所有距离的均值作为两个组合数据点间的距离。这种方法计算量比较大,但结果比前两种方法更合理。
我们使用Average Linkage计算组合数据点间的距离。下面是计算组合数据点(A.F)到(B,C)的距离,这里分别计算了(A.F)和(B.C)两两间距离的均值.
实例2
以下是一个使用AgglomerativeClustering层次聚类算法对鸢尾花数据集进行聚类,并可视化处理的代码示例和详细注释:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import AgglomerativeClustering
from sklearn.datasets import load_iris
# 加载鸢尾花数据集
data = load_iris()
X = data.data
y = data.target
# 实例化AgglomerativeClustering对象,指定聚类数量为3
cluster = AgglomerativeClustering(n_clusters=3)
# 将数据进行聚类
cluster.fit(X)
# 获取每个样本所属的簇标签
labels = cluster.labels_
# 定义颜色映射
colors = np.array(['red', 'green', 'blue'])
# 可视化聚类结果
plt.scatter(X[:, 0], X[:, 1], c=colors[labels])
plt.xlabel('Sepal length')
plt.ylabel('Sepal width')
plt.show()
以上就是一个使用AgglomerativeClustering层次聚类算法对鸢尾花数据集进行聚类,并可视化处理的代码示例和详细注释。该算法的本质是通过不停地合并最接近的簇,直到簇的数量达到预设的聚类数量。具体来说,它采用自底向上的策略,先将每个样本作为一个簇,然后迭代地将最接近的簇合并,直到达到指定的簇数量或者所有样本都被合并在同一个簇中。
- 代码运行结果如下: