本文介绍聚类的基础知识和层次聚类算法。
0x01、聚类的基本概念
聚类是针对给定的样本,依据它们特征的相似度或距离,将其归并到若干个“类”或“簇”的数据分析问题。一个类是给定样本集合的一个子集。直观上,相似的样本聚集在相同的类,不相似的样本分散在不同的类。这里,样本之间的相似度或距离起着重要作用。聚类的目的是通过得到的类或簇来发现数据的特点或对数据进行处理,在数据挖掘、模式识别等领域有着广泛的应用。聚类属于无监督学习,因为只是根据样本的相似度或距离将其进行归类,而类或簇事先并不知道。
常用的聚类方法有层次聚类和K均值聚类。
层次聚类(hierarchical clustering)又有聚合(自下而上)和分裂(自上而下)两种方法。聚合法开始将每个样本各自分到一个类,之后将相距最近的两类合并,建立一个新的类,重复此操作直到满足停止条件,得到层次化的类别。分裂法开始将所有样本分到一个类,之后将已有类中相距最远的样本分到两个新的类,重复此操作直到满足停止条件,得到层次化的类别。
K均值聚类(k-means clustering)是基于中心的聚类方法。通过迭代,将样本分到K个类中,使得每个样本与其所属类的中心或均值最近,得到K个“平坦的”、非层次化的类别,构成对空间的划分。
0x02、相似度或距离
聚类的对象是观测数据,或样本集合。假设有n个样本,每个样本由m个属性的特征向量组成。样本集合可以用矩阵X表示:
矩阵的第 j 列表示第 j 个样本, ;第 i 行表示第 i 个属性,;矩阵元素 表示第 j 个样本的第 i 个属性值,。
聚类的核心概念是相似度(similarity)或距离(distance),有多种相似度或距离的定义。因为相似度直接影响聚类的结果,所以其选择是聚类的根本问题。具体哪种相似度更合适取决于应用问题的特性。
1、闵可夫斯基距离
在聚类中,可以将样本集合看作是向量空间中点的集合,以该空间的距离表示样本之间的相似度。闵可夫斯基距离越大相似度越小,距离越小相似度越大。
【定义:闵可夫斯基距离(Minkowski distance)】给定样本集合,是 维实数向量空间 中点的集合,其中 , , ,样本 与样本 的闵可夫斯基距离定义如下,这里 :
当 时称为欧氏距离(Euclidean distance):
当 时称为曼哈顿距离(Manhattan distance):
当 时称为切比雪夫距离(Chebyshev distance),取各个坐标数值差的绝对值的最大值:
2、马哈拉诺比斯距离
马哈拉诺比斯距离(Mahalanobis distance),简称马氏距离,也是另一种常用的相似度,考虑各个分量(特征)之间的相关性并与各个分量的尺度无关。马哈拉诺比斯距离越大相似度越小,距离越小相似度越大。
【定义:马哈拉诺比斯距离】给定一个样本集合 ,,其协方差矩阵记作 ,样本 与样本 之间的马哈拉诺比斯距离 定义如下,其中, , :
当 为单位矩阵时,即样本数据的各个分量互相独立且各个分量的方差为1时,马氏距离就是欧氏距离,所以马氏距离是欧氏距离的推广。
3、相关系数
样本之间的相似度也可以用相关系数(correlation coefficient)来表示。相关系数的绝对值越接近于1,表示样本越相似;越接近于0,表示样本越不相似。
【定义:相关系数】样本 与样本 之间的相关系数定义为:
其中, , 。
4、夹角余弦
样本之间的相似度也可以用夹角余弦(cosine)来表示。夹角余弦越接近1,表示样本越相似;越接近于0,表示样本越不相似。
【定义:夹角余弦】样本 与样本 之间的相夹角余弦定义为:
需注意不同相似度度量得到的结果并不一致。进行聚类时,选择适合的距离或相似度非常重要。
0x03、类或簇
通过聚类得到的类或簇,本质是样本的子集。如果一个聚类方法假定一个样本只能属于一个类,或类的交集为空集,那么该方法称为硬聚类(hard clustering)方法;如果一个样本可以属于多个类,或类的交集不为空集,那么该方法称为软聚类(soft clustering)方法。这里只考虑硬聚类方法。
1、类的定义
用 表示类或簇,用 表示类中的样本,用 表示 中样本的个数,用 表示样本 与样本 之间的距离。类或簇有多种定义,下面给出几个常见的定义。
【定义1】设 为给定的正数,若集合 中任意两个样本 有 ,则称 为一个类或簇。
【定义2】设 为给定的正数,若对集合 中任意样本 ,一定存在 中的另一个样本 ,使得 ,则称 为一个类或簇。
【定义3】设 为给定的正数,若对集合 中任意一个样本 , 中的另一个样本 ,满足:
其中 为 中样本的个数,则称 为一个类或簇。
【定义4】设 和 为给定的两个正数,如果集合 中任意两个样本 的距离 满足下式,则称G为一个类或簇:
以上四个定义,第一个定义最常用,并且由它可推出其他三个定义。
2、类的特征
类的特征可以通过不同角度刻画,常用特征有如下三种:
(1)类的均值 ,又称为类的中心。式中 是类 的样本个数:
(2)类的直径(diameter) ,是类中任意两个样本之间的最大距离,即:
(3)类的样本散布矩阵(scatter matrix) 与样本协方差矩阵(covariance matrix) :
,
其中,m为样本的维数,即样本属性的个数。
3、类与类之间的距离
类 与类 之间的距离 ,也称为连接(linkage)。类与类之间的距离也有多种定义。
设 包含 个样本, 包含 个样本,分别用 和 表示 和 的均值,即类的中心。
(1)最短距离或单连接(single linkage)
定义类 的样本与类 的样本之间的最短距离为两类之间的距离:
(2)最长距离或完全连接(complete linkage)
定义类 的样本与类 的样本之间的最长距离为两类之间的距离:
(3)中心距离
定义类 与类 的中心 与 之间的距离为两类之间的距离:
(4)平均距离
定义类 与类 的任意两个样本之间距离的平均值为两类之间的距离:
0x04、层次聚类
层次聚类假设类别之间存在层次结构,将样本聚到层次化的类中。层次聚类又有聚合(agglomerative)或自下而上(botton-up)聚类和分裂(divisive)自上而下(top-down)聚类两种方法。因为每个样本只属于一个类,所以层次聚类属于硬聚类。
聚合聚类的具体过程如下:对于给定的样本集合,开始将每个样本分到一个类,然后按照一定规则(例如类间距最小),将满足规则条件的两个类进行合并;如此反复进行,每次减少一个类,直到满足停止条件,如所有样本聚为一类。
聚合聚类需要预先确定三个要素:距离或相似度,合并规则,停止条件。根据这些要素的不同组合,可以构成不同的聚类方法。距离或相似度可以是闵氏距离、马氏距离、相关系数、夹角余弦。合并规则一般是类间距离最小,类间距离可以是最短距离、最长距离、中心距离、平均距离。停止条件可以是类的个数达到阈值、类的直径超过阈值。
【聚合聚类算法】这里采用欧氏距离为样本之间距离;类间距离最小为合并规则,最短距离为类间距离;类的个数为1(即所有样本聚为一类)为停止条件。
输入: 个样本组成的样本集合及样本之间的距离。
输出:对样本集合的一个层次化聚类。
(1)计算 个样本两两之间的欧氏距离 ,记作矩阵 ;
(2)构造 个类,每个类只包含一个样本;
(3)合并类间距离最小的两个类,其中最短距离为类间距离,构建一个新类;
(4)计算新类与当前各类的距离。若类的个数为1,终止计算;否则回到步骤(3)。
聚合层次聚类的复杂度是 ,其中m是样本的维数,n是样本个数。
0x05、层次聚类聚合算法在sklearn中的实现
sklearn.cluster.agglomerativeClustering
参数 | 参数类型及取值范围 | 说明 |
n_clusters | 整型或None | 簇的个数。默认值是2。 如果distance_threshold不为None,则n_clusters必须为None。 |
affinity | 字符串或可调用对象 | 计算相似度的度量。默认值'euclidean'。 可选{'euclidean','l1','l2','manhattan','cosine','precomputed'}。当linkage参数值是'ward',affinity参数只能是'euclidean'。若是'precomputed',则输入是距离矩阵。 |
memory | 字符串或 joblib.Memory接口对象 | 缓存树的计算输出。默认值是None,不缓存。 如果是字符串,则应该是缓存输出的目录。 |
connectivity | 向量或可调用对象 | 连接矩阵。默认值是None,即层次聚类算法是非结构化的。 为每个样本定义遵循给定数据结构的相邻样本。可以是连接矩阵本身,也可以是将数据转换为连接矩阵(如从k近邻图派生) 的可调用对象。 |
compute_full_tree | auto或布尔型 | 尽早在n_clusters处结束树的构建。默认值'auto'。 簇的数量不比样本数量少时,可缩短计算时间。该参数仅当指定了连接矩阵时才有效。需注意,当调整簇的数量并使用缓存时,计算完整的树可能是有利的。当distance_threshold是None时必须为True。当distance_threshold不为None或n_clusters小于100或0.02*样本数量时,auto等效于True,否则auto等效于False。 |
linkage | {'ward','complete', 'average','single'} | 指定连接算法。默认值ward。 该参数决定使用哪种距离来度量两簇中实例的距离。满足此度量的两簇将被合并。ward:将要合并的簇的方差最小化;average:使用两簇中每个实例距离的平均值;compete:使用两簇之间实例距离的最大值;single:使用两簇之间实例距离的最小值。 |
distance_threshold | 整型 | 距离阈值,超过该阈值则类不会再聚合。默认值是None。 若不为None,n_clusters参数值必须是None,而compute_full_tree参数值必须为True。 |
参考:
[1]. 李航. 统计学习方法(第二版)
[2]. 周志华. 机器学习
[3]. Python机器学习——Agglomerative层次聚类 - 博客园
[4].