CVPR18 - 不需要指定超参数的无监督聚类《Efficient Parameter-free Clustering Using First Neighbor Relations》

原文地址

https://arxiv.org/abs/1902.11266

初识

无监督聚类是一个基础研究领域,几乎所有学科都会涉及到,但目前仍没有一种通用的聚类算法。因为要构建一个通用的算法很难,因为这需要算法具备以下特性:

  1. 以较高的精准自动确定true(或接近true)的聚类;
  2. 不需要超参数或者对数据的先验知识;
  3. 可以泛化到不同的数据域;
  4. 可以扩展到大数据上,且无需大量计算资源。

作者总结现有的聚类思想都在探寻数据之间的相似度,比如基于中心的聚类方法(比如KMeans)就是根据点与聚类中心的直接距离,以迭代方式将点分配给所选数量的聚类;而聚合/层次聚类方法也是基于预定义的距离阈值合并数据点;最近的一些方法从点的成对距离构建相似性图(例如谱聚类),并通过将这些距离用作边权重并将采样点用作节点来解决图划分问题。并且这些方法都融入了人为设计的先验假设,比如聚类中心数,阈值或者其他的超参数,而这些参数需要人为调节,在不同的数据上需要进行不同的调整。

而本文提出的FINCH算法核心思想是通过每个数据点的最近邻去进行连接,从而得到数据划分。该算法不需要用户去定义任何的超参数,是一种fully parameter-free unsupervised algorithm,并且计算消耗很低,因此可以扩展到大数据集。

相知

单次聚类过程

主要讲述了算法的核心步骤:如何利用最近邻信息进行点-点的连接

首先将每个样本看作一个数据点,并得到其最近邻的信息,根据下式求得邻接矩阵

在这里插入图片描述
其中 k i 1 k_i^1 ki1表示样本i的最近邻索引,上式的含义表示:1)连接样本i的最近邻;2)如果样本j的最近邻是i,也进行连接;3)如果样本i和样本j的最近邻一致,也进行连接。

经过上式的推导,就可以得到一个完整且稀疏的邻接矩阵,其中连接在一起的样本点即为同一个聚类。如下例所示,(a)列举了每个星球以及其最近邻的信息(根据NASA提供的数据进行计算得到),(b)是根据上式得到的邻接矩阵,(c)就是根据(b)矩阵得到的图划分。经过FINCH算法,9个星球被划分成了三个类,并且具有一定的可解释性,比如岩石行星划分到了一起,气体行星划分到了一起,ice giant划分到了一起。
在这里插入图片描述

扫描二维码关注公众号,回复: 17241696 查看本文章

注意,FINCH并不是解决图划分的问题,而是直接得出聚类结果【只是用了图来展示】

FINCH层次聚类算法

单次聚类只能提供一个层级的结果,而且对于数据的真实聚类没有一个好的定义,因为人们认为正确的聚类其实也是观察者的主观意见。因此可以多次迭代,得到不同层次下的聚类结果,以捕获不同粒度级别的底层数据结构。由于算法仅使用第一个整数邻居索引(First Integer Neighbor indices)来生成聚类层次(Clustering Hierarchy),因此作者将算法称为FINCH

既然涉及到层次聚类,根据上一节的流程需要得到每个簇(cluster)的最近邻信息,这就得计算cluster之间的距离。一些常用的连接方法,比如在层次聚类中average-linkage,其使用两个簇中的点两两距离的均值作为簇间距离。但这种方式需要计算两两样本间的距离,时间和空间成本都非常大,不宜于扩展到大数据集上。因为FINCH只需要求得最近邻信息,这可以通过很多快速的最近邻方法求得(比如k-d树,时间复杂度为O(logn)),因此作者对每个簇的样本进行平均,再计算最近邻,大大减少了时间复杂度(由 O ( N 2 l o g ( N ) ) O(N^2log(N)) O(N2log(N))降低到 O ( N l o g ( N ) ) O(Nlog(N)) O(Nlog(N)))。算法整体流程如下所示:
在这里插入图片描述
在某些应用中,如果提前知道真实的聚类个数的话,也可以应用到FINCH算法中。因为FINCH本身属于层次聚类,只需要在对应的结果再进行多次简单迭代就好(每次简单迭代只合并距离最近的两个簇),比如真实聚类数为10个,FINCH某个层次为13个类,则进行3次简单迭代即可。算法流程如下所示:

在这里插入图片描述
实验结果

只展示一个简单的2D数据实验,更多实验请见原文

下图展示了在2D数据上不同算法的聚类效果,第一行的数据真实聚类有7个,第二行为6个。
在这里插入图片描述

回顾

常用的聚类方法通常需要融入一些人为的先验,比如指定距离阈值或者是设置聚类中心数。如果对一个无监督聚类任务尚没有较好的先验知识储备,那么将很难确定这些超参数的取值,需要花费大量的时间调参,并且换个场景可能又要进行调整。而本文提出的FINCH算法不需要额外指定这些参数,也能得出不错的聚类结果,大大增加了其通用性。

并且相对于常用的算法,FINCH只需要每个样本/簇的最近邻节点就可以进行聚类,可以用上ANN这些快速估计最近邻算法,使其能够在大规模数据上较快地得到结果,具有可扩展性。并且博主在自己的工作也用到了这个方法,效果很不错,性能比KMeans提升了一些,主要是速度变得非常快。有什么问题,只要提issue,作者也能很快地给出回复。

官方代码地址:https://github.com/ssarfraz/FINCH-Clustering

猜你喜欢

转载自blog.csdn.net/qq_36560894/article/details/122307420