聚类简介
聚类任务
在实际问题中,样本大多数是无标记的,而机器学习的目的是通过对无标记训练样本的学习来揭示数据的内在性质和规律。此类方法应用最广的是“聚类”(clustering)。
形式化的来说,在“无监督学习”中,聚类试图将样本划分为若干个通常是不相交的子集,每个子集称为一个“簇”(cluster)。聚类的作用:
- 作为一种探索性的方法,用于寻找数据内在特点和分布规律
- 作为分类等其他学习任务的前驱过程。作为分类的预处理,不直接解决数据分析。
我们要做的事情,无外乎就是把相似的样本归为一类,把不同的类别区分开。如上图所示。
但是问题来了:怎么划分样本,怎么评价划分的好坏? 回答这个问题,需要先讨论聚类算法涉及的两个基本问题–性能度量和距离计算。
性能度量
聚类的性能度量和“监督学习”的性能度量作用类似,对于聚类结果,我们需要一个评价标准来评估好坏;同时,给定的性能度量如同损失函数一样,给了聚类过程优化目标,这样聚类能得到更好的结果。
聚类是将样本划分为若干个簇,从直观的上来看,我们希望同一簇的样本尽可能相似,不同簇的样本尽可能不同,这类似线性模型-线性判别分析的度量定义。形式化的来说,聚类结果的“簇内相似度”(intra-cluster similarity)高且“簇间相似度”(inter-cluster similarity)低。如下图:
聚类性能度量大概分为两类:
- 一类是将聚类结果与某个“参考模型”进行比较,称为“外部指标”(external index)
- 另一类是直接考察聚类结果而不利用任何参考模型,称为“内部指标”(internal index)
对于有参考模型的
下面引入一些定义:
对数据集
D={x1,x2,...,xm}
,假定通过聚类给出的簇划分为
C={C1,C2,...,Ck}
,参考模型给出的簇划分为
C∗={C∗1,C∗2,...,C∗s}
,相应地,令
λ
与
λ∗
分别表示
C
和
集合 SS 包含了在 C 中隶属于相同簇且在
因此有 a+b+c+d=C2m=m(m−1)2 成立.
基于上面的定义,有下面常用的聚类性能度量外部指标:
Jaccard系数(Jaccard Coefficient,简称JC)
JC=aa+b+c所有属于同一类的样本对,同时在 C,C∗ 中隶属于同一类的样本对的比例。FM指数(Fowlkes and Mallows Index,简称FMI)
FMI=aa+b⋅aa+c−−−−−−−−−−−√在 C 中属于同一类的样本对中,同时属于C∗ 的样本对的比例为 p1 ;在 C∗ 中属于同一类的样本对中,同时属于 C 的样本对的比例为p2 ,FMI就是 p1 和 p2 的几何平均。Rand指数(Rand Index,简称RI)
RI=2(a+d)m(m−1)ARI指数(Adjusted Rand Index,ARI):
ARI=RI−E[RI]max(RI)−E[RI]使用RI有个问题,对于随机聚类,RI指数不保证接近0。而ARI指数可通过随机聚类情况下的RI(即 E[RI] )来解决。
显然,上述性能度量的结果值均在 [0,1] 区间,值越大越好。
直接考察聚类结果的
考虑聚类结果的簇划分为
C={C1,C2,...,Ck}
,定义:
其中,
dist(⋅,⋅)
用于计算两个样本之间的距离;
μ
代表簇
C
的中心点
基于上面的定义,下面是常用的聚类性能度量内部指标:
DB指数( Davies-Bouldin Index,简称DBI)
DBI=1k∑i=1kmaxj≠i(avg(Ci)+avg(Cj)dcen(Ci,Cj))给定两个簇,每个簇样本之间平均值之和和比上两个簇的中心点之间的距离作为度量。然后考察该度量对所有簇的平均值。显示DBI越小越好。Dunn指数( Dunn Index,简称DI)
DI=min1≤i<k{minj≠i(dmin(Ci,Cj)max1≤l≤kdiamCl)}任意两个簇之间最近的距离的最小值,除以任意一个簇内距离最远的两个点的距离的最大值。DI越大越好。
显然,DBI的值越小越好,DI值相反,越大越好
距离计算
在上面度量性能内部指标中,我们用到了
dist(⋅,⋅)
函数,
dist(⋅,⋅)
是一个“距离度量”,为什么需要定义这个距离度量?
在实际聚类过程中,我们会对数据做预处理,如果处理的不当,会影响聚类的结果。如下图:
分别对x轴和y轴放缩0.2,会直接影响聚类结果。故我们在做聚类时,需要一个好的距离度量标准。
形式上,度量距离函数 dist(⋅,⋅) 需要满足一些性质:
- 非负性: dist(xi,xj)≥0
- 同一性: dist(xi,xj)=0 当前仅当 xi=xj
- 对称性: dist(xi,xj)=dist(xj,xi)
- 直递性: dist(xi,xj)≤dist(xi,xk)+dist(xk,xj)
给定样本
xi={xi1,xi2,...,xin}
与
xj={xj1,xj2,...,xjn}
,最常用的是Minkowski distance:
-
p=1
,即为Manhattan distance:
distman(xi,xj)=||xi−xj||1=∑u=1n|xiu−xju|
-
p=2
,即为Euclidean distance:
disted(xi,xj)=||xi−xj||2=∑u=1n|xiu−xju|2−−−−−−−−−−−−√
有序属性和无序属性下的距离测量
在讨论距离计算时,属性上是否定义了“序”关系更为重要。例如定义域 {1,2,3} 能直接计算距离,这样的属性称为“有序属性”。又有定义域为 {飞机,火车,轮船} 这样的数据不能之间计算距离,称为“无序属性”。
对于无序属性可采用VDM(Value Difference Metric),令
mu,a
表示在属性
u
上取值为
将Minkowski distance和VDM结合即可处理混合属性。假定有
nc
个有序属性、
n−nc
个无序属性,则:
当样本空间中不同属性的重要性不同,可使用“加权距离”.例如:
k均值算法
见我的Blog 机器学习Chapter3-(聚类分析)Python实现K-Means算法
高斯混合模型与EM算法
见我的Blog机器学习Chapter3-(聚类分析)详解高斯混合模型与EM算法(Python实现)
密度聚类
密度聚类即“基于密度的聚类”(density-based clustering),此类算法假设聚类结构能通过样本分布的紧密程度确定。通常情况下,密度聚类算法从样本密度的角度考察样本之间的可连接性,并基于可连接样本不断扩展聚类簇以获得最终的聚类结果。
例如下面的数据集就很适合用密度聚类:
DBSCAN算法
DBSCAN是一种著名的密度聚类算法,基于一组“领域”来刻画样本分布的紧密程度。
一些定义的定义图
DBSCAN算法流程
层次聚类
实际中的聚类要求
scikit-learn官方给出了一份各种聚类模型的参数调整和使用场景的建议表格。如下:
模型 | 关键参数 | 使用场景 |
---|---|---|
K均值算法 | 簇的数量 | 通用的聚类方法,用于均匀的簇的大小,簇的数量不多的情况 |
GMM算法 | 簇数量等 | 用于平坦的集合结构,对密度估计很合适 |
DBSCAN算法 | 领域
ϵ
MinPts | 用于不均匀的簇大小,以及非平坦的集合结构 |
Agglomerative Clustering算法 | 簇的数量,链接类型 | 用于簇的数量较多,有连接约束的情况 |
上面介绍了多种聚类算法,不同的聚类算法有着不同的应用背景。聚类也许是机器学习算法中“新算法”出现最多、最快的领域。一个重要的原因是聚类不存在客观的标准。
在实际应用中,聚类簇的数量的选择选取通过结合性能度量指标和具体问题分析。例如给出了ARI随n_clusters曲线,通常选择ARI最大值附近的一批n_clusters。
实际中可能潜在的簇数量数量较大,从0开始绘制ARI随n_clusters曲线不太现实,则可以大概估计簇的数量范围,通过降维技术观测原始数据集经过降维后在平面或三维空间的分布规律,从中大概估计出簇的量级。或者通过他人求解类似的聚类问题来获取这一类问题的近似簇量级。