这篇文章会拿一些日常工作中最常用的聚类算法做介绍,然后会对最近的一些聚类算法成果中挑几篇有意思的说一说,全文较长
聚类的概念
对于有标签的数据,我们进行有监督学习,常见的分类任务就是监督学习;而对于无标签的数据,我们希望发现无标签的数据中的潜在信息,这就是无监督学习。聚类,就是无监督学习的一种,它的概念是:将相似的对象归到同一个簇中,使得同一个簇内的数据对象的相似性尽可能大,同时不在同一个簇中的数据对象的差异性也尽可能地大。即聚类后同一类的数据尽可能聚集到一起,不同数据尽量分离。
聚类算法的分类
聚类算法有很多种分法,体系也很大,这里举例几种分法:
基于划分的聚类:聚类目标是使得类内的点足够近,类间的点足够远,常见的如k-means及其衍生算法
基于密度的聚类:当邻近区域的密度超过某个阈值,则继续聚类,如DBSCAN; OPTICS
层次聚类:这个下面会具体介绍到,包括合并的层次聚类,分裂的层次聚类,实际上可以看作是二叉树的生成和分裂过程。下面会介绍实际应用中常用的HDBSCAN
基于图的聚类: 通过建图来进行聚类,这是聚类算法中的大头,很多较新的聚类算法都有图聚类的思想。这篇文章会介绍以Chinese Whisper,谱聚类两大具有代表性的图聚类算法
基于GCN(图神经网络)的聚类:实际上这个本质上也是基于图的聚类,然而基于GCN的聚类算法会有深度学习中的训练的概念,而传统的聚类算法则是通过人工设定阈值来决定的,所以这里也分开列了一类, 这篇文章会介绍《Learning to Cluster Faces on Affinity Graph》、CDP两篇论文的思想
...
其实还有很多分类,但这里不再列举了,有兴趣的同学可以参考sklearn文档中关于聚类的划分 https://scikit-learn.org/stable/modules/clustering.html#clustering
K-Means
这个可以说是最基础的聚类算法了,它的输入需要簇的个数k,这个k是用户指定的,也就是说需要提前确定类别,其算法流程是:
- 随机确定k个初始点u1, u2...uk作为聚类质心
- 重复以下过程直到收敛:
- 对于每一个样例,找到离它最近的质心作为label:
- 对于每一个类j, 更新其质心:
- 对于每一个样例,找到离它最近的质心作为label:
优点: 速度快
缺点:
- 必须提前知道"k", 也就是有多少个簇
- 容易陷入局部最优
- 数据必须符合“数据之间的相似度可以使用欧式距离衡量”,这个是什么意思呢,看下图,这种数据的分布,样本点的距离不能简单地用欧式距离来衡量,否则分类效果会非常差。这里的距离衡量应该是“测地距离”,也就是样本沿着曲面到达另一个样本点的距离。如果在这种数据空间想要使用kmeans,必须先进行空间的转化
k-means有一些改进算法,多是针对k-means会受异常点的影响这一点来改进的,比如K-Means++, K-Medians...
基于密度的算法-DBSCAN
基于密度的算法,要求聚类空间的一定区域所包含的对象的数目不小于某一给定阈值,先了解一些基本概念:
(1)Eps邻域:给定对象半径Eps内的邻域称为该对象的Eps邻域;
(2)核心对象(core point):如果对象的Eps邻域至少包含最小数目MinPts的对象,则称该对象为核心对象;
(3)直接密度可达(directly density-reachable):若某点p在点的q的Eps领域内,且q是一个核心对象,则p-q直接密度可达
(4)密度可达(density-reachable):如果存在一个对象链 p1, …,pi,.., pn,如果对于任意pi, pi-1都是直接密度可达的,则称pi到pi-1密度可达,实际上是直接密度可达的传播链
(5)密度相连(density-connected):如果从某个核心对象p出发,点q和点k都是密度可