前言:关于谱聚类,已经有很多厉害的老师和大牛写过教程博客等,也有很不错的tutorial文章可供参考。此博文仅记述个人的一些总结、思考、疑问,算是对现有谱聚类学习资源的一个小补充。
1. 谱聚类简述
说到聚类,可能最先想到的就是经典的Kmeans算法。但是,Kmeans的应用是有前提条件的,它假设(目标式中的)误差服从标准正态分布,因此,Kmeans在处理非标准正态分布和非均匀样本集时,聚类效果会比较差。对于非专业滴同志们,这种统计学术语听起来总是让人觉得有点虚、不好懂,下面给两个图,直观感受一下。
图1.1 (a)非标准正态分布集 (b)非均匀分布集 (c) 处理two moon数据集kmeans可能的聚类结果
对于图1.1中给出的情形,用Kmeans聚类就显得有些力不从心了,比如对于two moon这个toy dataset,理想情况下的结果应该和(a)中所示一致,但kmeans聚类后的效果可能是(c)中的样子。
为了处理这种奇奇怪怪形状分布的数据,谱聚类(spectral clustering)该出场了。不同于Kmeans采用数据点和聚类中心的欧式距离作为相似性度量,谱聚类是基于数据的相似度矩阵,也即,只用给出数据的相似度矩阵而不用给出数据本身,谱聚类就可以得到最终的聚类结果。这里先提一句,谱聚类算法得到最终聚类结果,一般是通过Kmeans,就是说Kmeans成为了谱聚类算法的一部分。另外应该指出的是,谱聚类是一类基于谱方法的聚类算法,只不过平常提到谱聚类,一般都是指代最原始和经典的那两个(Ncut,Ratio Cut),在很多文章和博客里,看到的算法伪代码就是它们的。还有,为什么取名叫谱聚类,个人觉着这个“谱”字,正表明了求解过程与特征分解有关。
2. 公式化表述
在这一节,我们来看一下图论中的标准切割(Ncut)和比例切割(RatioCut),并由此得到标准化的和非标准化的谱聚类目标函数。下面咱们先简单了解一些图论中的概念(这方面基础内容不了解的话,可求助wikipedia/baidu,或见其它博文介绍,或者从公式推导角度直接往下看,也没多大问题)。
设
G=(V,E)
表示一个带权无向图,其中
V={vi}ni=1
是顶点,可以对应成n个数据点,
E
是用来连接顶点的边的集合,每条边上带有权值,
继续,来看看什么是“割–Cut”。给定一个顶点集
A⊂V
,其补集表示为
A¯
。评估集合
A
的大小有两种方式,一种是用
给了一堆概念和定义,一不小心就让人如坠云雾,为什么要扯出什么图论?这个“割”真的是用小刀割东西的那个“割”嘛?首先第一个问题,把数据点看作是一个图中的顶点,继而把对数据的处理,转化为对图的分析,这种隐去实际意义,抓住问题本质的过程,就是建模,模型建好了,在理论上求解完毕了,再反过来对应回一个个实际的问题。事实上,很多实际生活中的问题,就是通过图来分析的,比如实现手机地图软件里的实时导航功能,就是一个路径规划的问题—-两个目的地,即图中两个顶点,是否可达,即是否存在一系列边将这两个顶点连起来,最短路径又是哪条,即怎么走最近。第二个问题,就是你想的那个割,这里割的是图中的边。想一想,要把数据点聚类成若干个簇,对应就是把图中的顶点分成若干个组,我们很自然地希望组内顶点间的关联度大( wij 大),组间顶点的关联度小,也就是说,我们可以把权值小的那些边给割断,保留权值大的那些边,以达到分组的目的。
2.1 由Ratio Cut到非标准谱聚类
假设我们要把顶点集分成k个组—-聚类成k个簇, A1,...,Ak ,满足 Ai∩Aj=∅ , A1∪,...,∪Ak=V 。我们想让被割去的都是一些权值小的边,即保证了关联度大的顶点被分到同一个组内,那么我们可以最小化下面的比例切割目标式:
定义k个簇指示向量(indicator vector)
fj=(f1j,...,fnj)′
,其中
2.2 由Ncut到标准谱聚类
标准切割(Normalized Cut, Ncut)和比例切割很类似,只是衡量簇的大小时是采用的另一种方式,Ncut的目标式是:
3. 目标函数的求解
3.1 瑞利商(Rayleigh quotient)
设 A∈Rn×n 是一个对称阵, 0≠x∈Rn ,称
定理:将A的特征值(都是实数)按从大到小的顺序排列为
对于非标准谱聚类目标式(2.6),因为 fTifi=1 为常数,所以
在上一节中,我们假装看不见离散约束从而得到了谱聚类的目标式,大家心里一定会有困惑,哪能这样搞,那最后的结果肯定不是原问题的解了呀。的确,这么粗暴地简化问题,在理论上是不能保证我们最后得到的解,和原问题(Ratio Cut/Ncut)的解之间有什么必然联系的,只不过在实际问题中,谱聚类取得的效果的确还是不错的。
【注】:根据定义,可知拉普拉斯矩阵L是一个对称半正定阵,即所有特征值都为非负实数,且L的最小特征值为0。对于一个全连通图,L只有一个0特征值,且对应的特征向量为常1向量(constant one vector),就是所有元素都取相同值的单位向量,这种指示向量其实是不具备区分信息的,或者说,它表示把原图划分为一个空集和图自身。所以有时候,我们直接把这个特征向量去掉,只对k-1个指示/特征向量进行分析。对于一个含c个连通分量的图,L有c个0特征值,对应的特征向量就是簇指示向量,可以直接区分出哪些数据点位于同一个连通分量内。另外,除去通过Kmeans得到最终的聚类结果,也有人用谱旋转(spectral rotation)得到,在此不做展开。
3.2 拉格朗日乘子法
在这一小节,我们直接从拉格朗日乘子法的角度来求解谱聚类。设 Λ∈Rk×k 为拉格朗日乘子矩阵,式(2.6)的拉格朗日函数为:
4. 从图重构角度再理解
4.1 正交非负约束
谱聚类目标式中,指示向量可取任意实值,而原始Ratio Cut/Ncut中,指示向量元素是离散的非负值。如果我们在松弛过程中,带上非负约束,那么新的模型应该更接近于原始问题,公式化表述就是:
图4.1 正交非负约束下的F示意图。这两个约束使得F是一个离散取值的、稀疏的、具有物理意义的矩阵,物理意义就是上面说的元素值对应数据和簇的关系。示意图中,F是一个“9x3”的指示矩阵,表示有9个数据点,分别属于3个不同的簇,比如第一个点属于第一个簇,则F的第一行第一列元素非零(实心黑圆),第一行其它元素为0,指示向量(F的列)是单位向量。
4.1 图重构角度
在这一节,我们关注一种特殊情形,并得到谱聚类的图重构理解视角。如果我们构建了一个图,它的相似度矩阵
式(4.2)就体现了图重构的思想。
W
是原本构建好的图(相似度矩阵确定后,图也确定了,故此处可用图代指),现在我们用簇指示矩阵来重构一个图,使得重构图和原始图
图4.2 指示矩阵重构图示意
5. 与K-means的联系
Kmeans公式化表述的证明过程可参见另一篇谈PCA的博文,这里只贴结果,Kmeans的目标函数可以写成如下形式:
与谱聚类对比,Kmeans的交替迭代过程,相当于是直接在求一个离散定义的带正交约束的问题,没有像谱聚类一样对原问题进行松弛。
6. 谱聚类的不足
因为要计算拉普拉斯矩阵的特征分解,谱聚类一个很大的问题是计算复杂度高,达到 O(n3) ,n为数据点个数。随着大数据时代的来临,如何改进谱聚类,使之能处理大规模数据,是一个很有价值的研究方向,比较典型的解决思路有通过Nystr o¨ m方法降低计算复杂度,有通过分步解决,先选取一部分代表点得到聚类标签,再根据代表点和其它点间的某种关系(常利于稀疏学习等技术构建这种关系),得到剩余的点的聚类标签。
另一个不足是out of sample的问题,即给定一个新的测试样例,无法方便地得到其聚类标签,必须重新对整个数据集(包括新加的样例)来一遍完整的谱聚类流程。这个问题的一种解决思路是,得到训练数据的指示矩阵F后,将F的行作为线性回归中的标签项( F−XTθ ),求出对应的回归系数矩阵 θ∈Rd×k ,对于新来的样例,根据 θ 得到其k维空间中的表达(拟合标签),再直接对所有数据的k维表达进行聚类就行。
7. 一个小问题
本文写作过程中主要参考了A Tutorial on Spectral Clustering,在论文第九页,定义Ratio Cut和Ncut的目标函数时,我始终觉得有点问题,少了一个系数1/2,虽然这并不影响最终结果,因为对于最小最大问题,常系数是可以去掉的。不过单纯从加深理解的角度,还是可以看细一点,在此贴出我的问题,还希望正好知道这一点的人不吝赐教。
上面的Ratio Cut 和Ncut的目标式中,第二个等式我觉得有问题,举个例子,k=2时:
主要参考文献/资源
【1】Luxburg U V. A tutorial on spectral clustering[J]. Statistics and Computing, 2007, 17(4):395-416.
【2】http://blog.csdn.net/v_july_v/article/details/40738211
【3】http://blog.pluskid.org/?p=287
【4】http://www.cnblogs.com/xingshansi/p/6702188.html
附录—–Ratio Cut相关证明
先贴一个很重要的公式,这一项在一些地方被称作图正则项(graph regularization),可以将有监督学习扩展为半监督学习,它可以从流形学习的观点来解释,这里不展开。
注意,这里 f 是一个n维指示向量,即
在参考文献[1]中,讲Ratio Cut时,是用二聚类情形作为例子,进行了较为详细地引出和推证,对于更为一般的情形,原文中只是给出了结论,网络上现有的博文,大多也是直接贴上原文中在二聚类情形下的证明。在这里,我们给出一般情形下的证明(本文正文中也是只关注了一般情形),证明过程跟二聚类情形是很类似的。
我们要证明的结论是: f′iLfi=cut(Ai,Ai¯)|Ai| , i=1,...,k ,k是簇的个数, fi 是第i个子集 Ai 的指示向量, fi 的第p个元素 fip 指示第p个数据点是否属于子集 Ai 。
注意到 f′iLfi=(FTLF)ii ,所以
Ncut的相关结论也可按照上述过程推证,此处略。