漫谈 Clustering (4): Spectral Clustering<转载>

转自http://blog.pluskid.org/?p=287

如果说 K-means 和 GMM 这些聚类的方法是古代流行的算法的话,那么这次要讲的 Spectral Clustering 就可以算是现代流行的算法了,中文通常称为“谱聚类”。由于使用的矩阵的细微差别,谱聚类实际上可以说是一“类”算法。

Spectral Clustering 和传统的聚类方法(例如 K-means)比起来有不少优点:

  • 和 K-medoids 类似,Spectral Clustering 只需要数据之间的相似度矩阵就可以了,而不必像 K-means 那样要求数据必须是 N 维欧氏空间中的向量。
  • 由于抓住了主要矛盾,忽略了次要的东西,因此比传统的聚类算法更加健壮一些,对于不规则的误差数据不是那么敏感,而且 performance 也要好一些。许多实验都证明了这一点。事实上,在各种现代聚类算法的比较中,K-means 通常都是作为 baseline 而存在的。 
  • 计算复杂度比 K-means 要小,特别是在像文本数据或者平凡的图像数据这样维度非常高的数据上运行的时候。

突然冒出这么一个要求比 K-means 要少,结果比 K-means 要好,算得还比 K-means 快的东西,实在是让人不得不怀疑是不是江湖骗子啊。所以,是骡子是马,先拉出来溜溜再说。不过,在K-medoids 那篇文章中曾经实际跑过 K-medoids 算法,最后的结果也就是一个 accuracy ,一个数字又不能画成图表之类的,看起来实在是没意思,而且 K-means 跑起来实在是太慢了,所以这里我还是稍微偷懒一下,直接引用一下一篇论文里的结果吧。

结果来自论文 Document clustering using locality preserving indexing 这篇论文,这篇论文实际上是提的另一种聚类方法(下次如果有机会也会讲到),不过在它的实验中也有 K-means 和 Spectral Clustering 这两组数据,抽取出来如下所示:

k TDT2 Reuters-21578
K-means SC K-means SC
2 0.989 0.998 0.871 0.923
3 0.974 0.996 0.775 0.816
4 0.959 0.996 0.732 0.793
9 0.852 0.984 0.553 0.625
10 0.835 0.979 0.545 0.615

其中 TDT2 和 Reuters-21578 分别是两个被广泛使用的标准文本数据集,虽然在不同的数据集上得出来的结果并不能直接拿来比较,但是在同一数据集上 K-means 和 SC (Spectral Clustering) 的结果对比就一目了然了。实验中分别抽取了这两个数据集中若干个类别(从 2 类到 10 类)的数据进行聚类,得出的 accuracy 分别在上表中列出(我偷懒没有全部列出来)。可以看到,Spectral Clustering 这里完胜 K-means 。

这么强大的算法,再戴上“谱聚类”这么一个高深莫测的名号,若不是模型无比复杂、包罗宇宙,就肯定是某镇山之宝、不传秘籍吧?其实不是这样,Spectral Clustering 不管从模型上还是从实现上都并不复杂,只需要能求矩阵的特征值和特征向量即可──而这是一个非常基本的运算,任何一个号称提供线性代数运算支持的库都理应有这样的功能。而关于 Spectral Clustering 的秘籍更是满街都是,随便从地摊上找来一本,翻开便可以看到 Spectral Clustering 算法的全貌:

  1. 根据数据构造一个 Graph ,Graph 的每一个节点对应一个数据点,将相似的点连接起来,并且边的权重用于表示数据之间的相似度。把这个 Graph 用邻接矩阵的形式表示出来,记为  。一个最偷懒的办法就是:直接用我们前面在 K-medoids 中用的相似度矩阵作为  。
  2. 把  的每一列元素加起来得到  个数,把它们放在对角线上(其他地方都是零),组成一个  的矩阵,记为  。并令  。
  3. 求出  的前  个特征值(在本文中,除非特殊说明,否则“前  个”指按照特征值的大小从小到大的顺序) 以及对应的特征向量  。
  4. 把这  个特征(列)向量排列在一起组成一个  的矩阵,将其中每一行看作  维空间中的一个向量,并使用 K-means 算法进行聚类。聚类的结果中每一行所属的类别就是原来 Graph 中的节点亦即最初的  个数据点分别所属的类别。

就是这么几步,把数据做了一些诡异的变换,然后还在背后偷偷地调用了 K-means 。到此为止,你已经可以拿着它上街去招摇撞骗了。不过,如果你还是觉得不太靠谱的话,不妨再接着往下看,我们再来聊一聊 Spectral Clustering 那几个“诡异变换”背后的道理何在。

其实,如果你熟悉 Dimensional Reduction (降维)的话,大概已经看出来了,Spectral Clustering 其实就是通过 Laplacian Eigenmap 的降维方式降维之后再做 K-means 的一个过程──听起来土多了。不过,为什么要刚好降到  维呢?其实整个模型还可以从另一个角度导出来,所以,让我们不妨先跑一下题。

在 Image Processing (我好像之前有听说我对这个领域深恶痛绝?)里有一个问题就是对图像进行 Segmentation (区域分割),也就是让相似的像素组成一个区域,比如,我们一般希望一张照片里面的人(前景)和背景被分割到不同的区域中。在 Image Processing 领域里已经有许多自动或半自动的算法来解决这个问题,并且有不少方法和 Clustering 有密切联系。比如我们在谈 Vector Quantization 的时候就曾经用 K-means 来把颜色相似的像素聚类到一起,不过那还不是真正的 Segmentation ,因为如果仅仅是考虑颜色相似的话,图片上位置离得很远的像素也有可能被聚到同一类中,我们通常并不会把这样一些“游离”的像素构成的东西称为一个“区域”,但这个问题其实也很好解决:只要在聚类用的 feature 中加入位置信息(例如,原来是使用 R、G、B 三个值来表示一个像素,现在加入 x、y 两个新的值)即可。

另一方面,还有一个经常被研究的问题就是 Graph Cut ,简单地说就是把一个 Graph 的一些边切断,让他被打散成一些独立联通的 sub-Graph ,而这些被切断的边的权值的总和就被称为 Cut值。如果用一张图片中的所有像素来组成一个 Graph ,并把(比如,颜色和位置上)相似的节点连接起来,边上的权值表示相似程度,那么把图片分割为几个区域的问题实际上等价于把 Graph 分割为几个 sub-Graph 的问题,并且我们可以要求分割所得的 Cut 值最小,亦即:那些被切断的边的权值之和最小,直观上我们可以知道,权重比较大的边没有被切断,表示比较相似的点被保留在了同一个 sub-Graph 中,而彼此之间联系不大的点则被分割开来。我们可以认为这样一种分割方式是比较好的。

实际上,抛开图像分割的问题不谈,在 Graph Cut 相关的一系列问题中,Minimum cut (最小割)本身就是一个被广泛研究的问题,并且有成熟的算法来求解。只是单纯的最小割在这里通常并不是特别适用,很多时候只是简单地把和其他像素联系最弱的那一个像素给分割出去了,相反,我们通常更希望分割出来的区域(的大小)要相对均匀一些,而不是一些很大的区块和一些几乎是孤立的点。为此,又有许多替代的算法提出来,如 Ratio Cut 、Normalized Cut 等。

不过,在继续讨论之前,我们还是先来定义一下符号,因为仅凭文字还是很难表述清楚。将 Graph 表示为邻接矩阵的形式,记为 ,其中  是节点  到节点  的权值,如果两个节点不是相连的,权值为零。设  和  为 Graph 的两个子集(没有交集),那么两者之间的 cut 可以正式定义为:

先考虑最简单的情况,如果把一个 Graph 分割为两个部分的话,那么 Minimum cut 就是要最小化  (其中  表示  的补集)。但是由于这样经常会出现孤立节点被分割出来的情况,因此又出现了 RatioCut :

以及 NormalizedCut :

其中  表示  中的节点数目,而  。两者都可以算作  的“大小”的一种度量,通过在分母上放置这样的项,就可以有效地防止孤立点的情况出现,达到相对平均一些的分割。事实上,Jianbo Shi 的这篇 PAMI paper:Normalized Cuts and Image Segmentation 正是把 NormalizedCut 用在图像分割上了。

搬出 RatioCut 和 NormalizedCut 是因为它们和这里的 Spectral Clustering 实际上有非常紧密的联系。看看 RatioCut ,式子虽然简单,但是要最小化它却是一个 NP 难问题,不方便求解,为了找到解决办法,让我们先来做做变形。

令  表示 Graph 的所有节点的集合,首先定义一个  维向量 

再回忆一下我们最开始定义的矩阵  ,其实它有一个名字,叫做 Graph Laplacian ,不过,我们后面可以看到,其实有好几个类似的矩阵都叫做这个名字:

Usually, every author just calls “his” matrix the graph Laplacian.

其实也可以理解,就好象现在所有的厂家都说自己的技术是“云计算”一样。这个  有一个性质就是:

这个是对任意向量  都成立的,很好证明,只要按照定义展开就可以得到了。把我们刚才定义的那个  带进去,就可以得到

另外,如果令  为各个元素全为 1 的向量的话,直接展开可以很容易得到  和  。由于  是一个常量,因此最小化 RatioCut 就等价于最小化  ,当然,要记得加上附加条件  以及  。

问题转化到这个样子就好求了,因为有一个叫做 Rayleigh quotient 的东西:

他的最大值和最小值分别等于矩阵  的最大的那个特征值和最小的那个特征值,并且极值在 等于对应的特征向量时取到。由于  是常数,因此最小化  实际上也就等价于最小化  ,不过由于  的最小的特征值为零,并且对应的特征向量正好为  (我们这里仅考虑 Graph 是联通的情况),不满足  的条件,因此我们取第二个小的特征值,以及对应的特征向量  。

到这一步,我们看起来好像是很容易地解决了前面那个 NP 难问题,实际上是我们耍了一个把戏:之前的问题之所以 NP 难是因为向量  的元素只能取两个值  和  中的一个,是一个离散的问题,而我们求的的特征向量  其中的元素可以是任意实数,就是说我们将原来的问题限制放宽了。那如何得到原来的解呢?一个最简单的办法就是看  的每个元素是大于零还是小于零,将他们分别对应到离散情况的  和  ,不过我们也可以采取稍微复杂一点的办法,用  的 K-means 来将  的元素聚为两类。

到此为止,已经有 Spectral Clustering 的影子了:求特征值,再对特征向量进行 K-means 聚类。实际上,从两类的问题推广到 k 类的问题(数学推导我就不再详细写了),我们就得到了和之前的 Spectral Clustering 一模一样的步骤:求特征值并取前 k 个最小的,将对应的特征向量排列起来,再按行进行 K-means 聚类。分毫不差!

用类似的办法,NormalizedCut 也可以等价到 Spectral Clustering 不过这次我就不再讲那么多了,感兴趣的话(还包括其他一些形式的 Graph Laplacian 以及 Spectral Clustering 和 Random walk 的关系),可以去看这篇 Tutorial :A Tutorial on Spectral Clustering 。

为了缓和一下气氛,我决定贴一下 Spectral Clustering 的一个简单的 Matlab 实现:

function idx = spectral_clustering(W, k)
    D = diag(sum(W));
    L = D-W;
 
    opt = struct(‘issym‘, true, ‘isreal‘, true);
    [V dummy] = eigs(L, D, k, ‘SM‘, opt);
 
    idx = kmeans(V, k);
end

最后,我们再来看一下本文一开始说的 Spectral Clustering 的几个优点:

  • 只需要数据的相似度矩阵就可以了。这个是显然的,因为 Spectral Clustering 所需要的所有信息都包含在  中。不过一般  并不总是等于最初的相似度矩阵——回忆一下,是我们构造出来的 Graph 的邻接矩阵表示,通常我们在构造 Graph 的时候为了方便进行聚类,更加强到“局部”的连通性,亦即主要考虑把相似的点连接在一起,比如,我们设置一个阈值,如果两个点的相似度小于这个阈值,就把他们看作是不连接的。另一种构造 Graph 的方法是将 n 个与节点最相似的点与其连接起来。
  • 抓住了主要矛盾,忽略了次要的东西,Performance 比传统的 K-means 要好。实际上 Spectral Clustering 是在用特征向量的元素来表示原来的数据,并在这种“更好的表示形式”上进行 K-means 。实际上这种“更好的表示形式”是用 Laplacian Eigenmap 进行降维的后的结果,如果有机会,下次谈 Dimensionality Reduction 的时候会详细讲到。而降维的目的正是“抓住主要矛盾,忽略次要的东西”。
  • 计算复杂度比 K-means 要小。这个在高维数据上表现尤为明显。例如文本数据,通常排列起来是维度非常高(比如,几千或者几万)的稀疏矩阵,对稀疏矩阵求特征值和特征向量有很高效的办法,得到的结果是一些 k 维的向量(通常 k 不会很大),在这些低维的数据上做 K-means 运算量非常小。但是对于原始数据直接做 K-means 的话,虽然最初的数据是稀疏矩阵,但是 K-means 中有一个求 Centroid 的运算,就是求一个平均值:许多稀疏的向量的平均值求出来并不一定还是稀疏向量,事实上,在文本数据里,很多情况下求出来的 Centroid 向量是非常稠密,这时再计算向量之间的距离的时候,运算量就变得非常大,直接导致普通的 K-means 巨慢无比,而 Spectral Clustering 等工序更多的算法则迅速得多的结果。

说了这么多,好像有些乱,不过也只能到此打住了。最后再多嘴一句,Spectral Clustering 名字来源于 Spectral theory ,也就是用特征分解来分析问题的理论了。

时间: 2024-08-26 08:41:28

漫谈 Clustering (4): Spectral Clustering<转载>的相关文章

漫谈 Clustering (4): Spectral Clustering

如果说 K-means 和 GMM 这些聚类的方法是古代流行的算法的话,那么这次要讲的 Spectral Clustering 就可以算是现代流行的算法了,中文通常称为“谱聚类”.由于使用的矩阵的细微差别,谱聚类实际上可以说是一“类”算法. Spectral Clustering 和传统的聚类方法(例如 K-means)比起来有不少优点: 和 K-medoids 类似,Spectral Clustering 只需要数据之间的相似度矩阵就可以了,而不必像 K-means 那样要求数据必须是 N 维

谱聚类算法及其代码(Spectral Clustering)

简介 文章将介绍谱聚类(spectral clustering)的基本算法,以及在matlab下的代码实现.介绍内容将包括: 从图分割角度直观理解谱聚类 谱聚类算法步骤 数据以及实现代码 本文将不会涉及细节化的证明和推导,如有兴趣可参考july大神的文章从拉普拉斯矩阵说到谱聚类. 对谱聚类的理解 这一节将从图分割聚类的角度直观理解谱聚类.不过,因为本人是从事社交媒体分析的,将从一种社会关系网络的角度来介绍网络图分割成多个子图的概念. 图的分割 首先将社会关系网络看成是一个整体,每一个个体(use

谱聚类算法(Spectral Clustering)

谱聚类(Spectral Clustering, SC)是一种基于图论的聚类方法——将带权无向图划分为两个或两个以上的最优子图,使子图内部尽量相似,而子图间距离尽量距离较远,以达到常见的聚类的目的.其中的最优是指最优目标函数不同,可以是割边最小分割——如图1的Smallest cut(如后文的Min cut), 也可以是分割规模差不多且割边最小的分割——如图1的Best cut(如后文的Normalized cut). 图1 谱聚类无向图划分——Smallest cut和Best cut 这样,

谱聚类(Spectral Clustering, SC)

谱聚类(Spectral Clustering, SC)是一种基于图论的聚类方法——将带权无向图划分为两个或两个以上的最优子图,使子图内部尽量相似,而子图间距离尽量距离较远,以达到常见的聚类的目 的.其中的最优是指最优目标函数不同,可以是割边最小分割——如图1的Smallest cut(如后文的Min cut), 也可以是分割规模差不多且割边最小的分割——如图1的Best cut(如后文的Normalized cut). 图1 谱聚类无向图划分——Smallest cut和Best cut 这样

Name Disambiguation in Author Citations using a Kway Spectral Clustering Method 论文之摘要

研究背景 要解决的问题 名字歧义问题会带来文献检索.网络搜索以及数据库整合上带来效率问题还可能对作者带来名誉上的问题.解决的两种名字歧义问题:1.一个作者实体却有多个相似(被简写)的或者被误拼的名字.2.多个不同的作者实体共享同一个名字(被简写或名字一样). 前人研究现状 前人采用的方法 记录连接(record linkage) 重复记录检测和消除(duplicate record detection and elimination) 合并/清除(merge/purge) 数据关联(data a

谱聚类(spectral clustering)及其实现详解

Preface 开了很多题,手稿都是写好一直思考如何放到CSDN上来,一方面由于公司技术隐私,一方面由于面向对象不同,要大改,所以一直没贴出完整,希望日后可以把开的题都补充全. 先把大纲列出来: 一.从狄多公主圈地传说说起 二.谱聚类的演算 (一).演算 1.谱聚类的概览 2.谱聚类构图 3.谱聚类切图 (1).RatioCut (2).Ncut (3).一点题外话 (二).pseudo-code 三.谱聚类的实现(scala) (一).Similarity Matrix (二).kNN/mut

ML | spectral clustering

What's xxx In multivariate statistics and the clustering of data, spectral clustering techniques make use of the spectrum (eigenvalues) of the similarity matrix of the data to perform dimensionality reduction before clustering in fewer dimensions. Th

谱聚类(spectral clustering)原理总结

谱聚类(spectral clustering)是广泛使用的聚类算法,比起传统的K-Means算法,谱聚类对数据分布的适应性更强,聚类效果也很优秀,同时聚类的计算量也小很多,更加难能可贵的是实现起来也不复杂.在处理实际的聚类问题时,个人认为谱聚类是应该首先考虑的几种算法之一.下面我们就对谱聚类的算法原理做一个总结. 一.谱聚类概述 谱聚类是从图论中演化出来的算法,后来在聚类中得到了广泛的应用.它的主要思想是把所有的数据看做空间中的点,这些点之间可以用边连接起来.距离较远的两个点之间的边权重值较低

Ultra-Scalable Spectral Clustering and Ensemble Clustering

1.Abstract: 在U-SPEC中,针对稀疏相似子矩阵的构造,提出了一种混合代表选择策略和k -最近邻代表的快速逼近方法.将稀疏相似子矩阵解释为二部图,利用转移割对图进行有效分割,得到聚类结果: 在U-SENC中,多个U-SPEC聚类器被进一步集成到一个集成聚类框架中,在保持高效的同时增强了U-SPEC的鲁棒性.基于多U-SEPC s的集成生成,构造了一种新的目标与基簇之间的二部图,并对其进行有效分割,达到了一致的聚类结果 U-SPEC和U-SENC都具有近乎线性的时间和空间复杂度 2.I