Spectral Clustering方法的总结

什么叫Spectral Algorithm?
 广义上来说,任何在演算法中用到SVD/特征值分解的,都叫Spectral Algorithm。  从很老很老的PCA/LDA,到比较近的Spectral Embedding/Clustering,都属于这类。


 为什么要用SVD/特征值分解?
 其实并不是为用而用,而是不得不用。  目前在研究领域碰到的很多基础问题都是NP-hard的,找一个比较好的近似演算法要费很大的精力;就算找到多项式的近似方法,也会出现实际使用上仍然太慢/解陷入局部极小等问题。

 比如说用K-means聚类,建模本身已经够简单了,但它是NP-hard的,用传统的EM迭代作近似解会陷入局部极小。

 反之,SVD理论上只有唯一解,演算法速度相对又快,并且有大量理论结果及周边性质支持,可以算是一个很理想地能将NP-hard问题“靠”上去的模型;它的另一个好处是,作为带约束二次规划的一种特殊情况,它对运算式为二次的目标函数的“相容性”比较好,“靠”所要求的数学技巧不高,任何人,任何方向都能拿来试试。


 Spectral Algorithm的几个方向:
 传统的如PCA/LDA用来做线性降维,2000年左右的一些Spectral Embedding及Spectral Clustering,还有周边的一些,如Low-rank approximation等等。

 

Spectral Clustering,中文通常称为“谱聚类”。由于使用的矩阵的细微差别,谱聚类实际上可以说是一“类”算法。

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

1)和 K-medoids 类似,Spectral Clustering 只需要数据之间的相似度矩阵就可以了,而不必像 K-means 那样要求数据必须是 N 维欧氏空间中的向量。

2)由于抓住了主要矛盾,忽略了次要的东西,因此比传统的聚类算法更加健壮一些,对于不规则的误差数据不是那么敏感,而且 performance 也要好一些。许多实验都证明了这一点。事实上,在各种现代聚类算法的比较中,K-means 通常都是作为 baseline 而存在的。

3)计算复杂度比 K-means 要小,特别是在像文本数据或者平凡的图像数据这样维度非常高的数据上运行的时候。

Spectral Clustering 算法的全貌:

1)根据数据构造一个 Graph ,Graph 的每一个节点对应一个数据点,将相似的点连接起来,并且边的权重用于表示数据之间的相似度。把这个 Graph 用邻接矩阵的形式表示出来,记为 W 。

2)把每一列元素加起来得到N 个数,把它们放在对角线上(其他地方都是零),组成一个N*N的矩阵,记为D 。并令L = D - W 。

3)求出L的前k个特征值(在本文中,除非特殊说明,否则“前k个”指按照特征值的大小从小到大的顺序)以及对应的特征向量。

4)把这k个特征(列)向量排列在一起组成一个N*k的矩阵,将其中每一行看作k维空间中的一个向量,并使用 K-means 算法进行聚类。聚类的结果中每一行所属的类别就是原来 Graph 中的节点亦即最初的N个数据点分别所属的类别。

下面是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 的几个优点:

1)只需要数据的相似度矩阵就可以了。这个是显然的,因为 Spectral Clustering 所需要的所有信息都包含在W中。不过一般W并不总是等于最初的相似度矩阵——回忆一下, 是我们构造出来的 Graph 的邻接矩阵表示,通常我们在构造 Graph 的时候为了方便进行聚类,更加强到“局部”的连通性,亦即主要考虑把相似的点连接在一起,比如,我们设置一个阈值,如果两个点的相似度小于这个阈值,就把他们看作是不连接的。另一种构造 Graph 的方法是将 n 个与节点最相似的点与其连接起来。

2)抓住了主要矛盾,忽略了次要的东西,Performance 比传统的 K-means 要好。实际上 Spectral Clustering 是在用特征向量的元素来表示原来的数据,并在这种“更好的表示形式”上进行 K-means 。

3)计算复杂度比 K-means 要小。这个在高维数据上表现尤为明显。例如文本数据,通常排列起来是维度非常高(比如,几千或者几万)的稀疏矩阵,对稀疏矩阵求特征值和特征向量有很高效的办法,得到的结果是一些 k 维的向量(通常 k 不会很大),在这些低维的数据上做 K-means 运算量非常小。但是对于原始数据直接做 K-means 的话,虽然最初的数据是稀疏矩阵,但是 K-means 中有一个求 Centroid 的运算,就是求一个平均值:许多稀疏的向量的平均值求出来并不一定还是稀疏向量,事实上,在文本数据里,很多情况下求出来的 Centroid 向量是非常稠密,这时再计算向量之间的距离的时候,运算量就变得非常大,直接导致普通的 K-means 巨慢无比,而 Spectral Clustering 等工序更多的算法则迅速得多的结果。

作者:洞庭散人

出处:http://phinecos.cnblogs.com/


 为什么先做降维再做K-means,效果会更好呢?
 另外,有趣的是K-means可以用PCA来做近似解。  K-means是说找到K个点,使得所有点到这K个点的距离平方和最小;
 而SVD是说找到一个子空间,使得所有点到这个子空间的距离平方和最小。  于是这两者就建立了联系,K-means便relax到SVD上去了。

 

 Spectral Clustering/Embedding:

 Spectral Clustering可算是Spectral Algorithm的重头戏。
 所谓Clustering,就是说聚类,把一堆东西(合理地)分成两份或者K份。  从数学上来说,聚类的问题就相当于Graph Partition的问题,即给定一个图G = (V, E),如何把它的顶点集划分为不相交的子集,使得这种划分最好。  其难点主要有两个:

 1.这个“合理”其实相当难达到,随便设一个目标函数可能达不到希望的结果。  大家可以看了看[1] Ravi Kannan and Adrian Vetta, On clusterings: good, bad and spectral,这里详细地讨论了一下准则的选择问题。
 2.即使我们定义了一个相当好的聚类准则,如何优化它又是一个问题。

 对于1,在Spectral Clustering这一块,各家有各家的想法。  主要有以下几种:
 a)大名鼎鼎的Normalized Cut[2],还有一些变种如Ratio Cut/Minmax cut.
 b)和代数图论紧密相联的Minimum conductance[1].
 c)没有准则,但有证明的演算法[3]
 d)不基于图,而是reformulate原来的聚类方法,使之变成SVD能解的问题[4]。
 2则完全被1的选取所决定。

 

 Normalized Cut:
 在图上,定义什么样的聚类最好,最简单的方法是圈定K个不相交顶点集之后,希望顶点集之间的边,其权值的和最小。  (边上的权值代表的是两头的顶点邻近的程度,或者说相似度)这就是所谓MinCut(最小割)问题。  二类分类的最小割不是NP-hard的,但是这不能让人感到开心,因为MinCut这个准则对于聚类不好。

 具体来说,Mincut完全可能将离大部队过远的单个顶点与其他顶点分开,形成两类。
 事实上,我们不仅仅要让割边的权和最小,而且要让这K个顶点集都差不多大,这样才符合聚类给人的直观感觉。

 于是在MinCut的基础上,出现了Normalized Cut.思路很简单,将Cut normalize一下,除以表现顶点集大小的某种量度(如vol A =所有A中顶点集的度之和)。
 也就是Normalize Cut(A, B) = Cut(A, B) / volA + cut(A, B) / volB
 然而这样一改,NP-hard就来了。  这几乎是所有组合优化问题的恶梦。

 怎么办呢?  把组合优化问题连续化,即所谓减少约束,进行适当的relax。  那么为什么会和SVD扯上的呢?

 很简单,聚类是东西分成不相交集,也就是有正交的含义在里面;只是分东西必须是0-1式的,这种离散化,就是np-hard的原因。  我们把正交约束保留,但把离散变成连续的,聚类就变成了寻找(列)正交阵的优化问题,那正是SVD的火力所在!

 就这样,通过这种巧妙的relax,NP-hard问题有了近似解。  且不说这近似解的质量如何,这种方法是相当令人振奋的。  (关于Normalized Cut近似解的质量,似乎没有什么文章能够给出严格的证明,只是实际效果不错就是了。)

 值得一提的是,Normalized Cut还和图上的Markov chain有紧密的关系[5]。  Normalized Cut这个量度,换成Markov chain的语言就是在图上随机游走,子集间相互“串门”的概率大小。  相当有趣。


Ref http://blog.sina.com.cn/s/blog_4b9b714a0100is5k.html

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值