zoukankan      html  css  js  c++  java
  • 关于谱聚类spectral clustering转载自http://blog.sina.com.cn/s/blog_4b9b714a0100is5k.html

    什么叫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可算是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的语言就是在图上随机游走,子集间相互“串门”的概率大小。  相当有趣。

    更多内容参考:http://www.cnblogs.com/vivounicorn/archive/2012/02/10/2343377.html

    http://www.cnblogs.com/FengYan/archive/2012/06/21/2553999.html

    以下摘自http://www.cnblogs.com/sparkwen/p/3455004.html

    谱聚类算法(Spectral Clustering)

     

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

    clip_image001图1 谱聚类无向图划分——Smallest cut和Best cut

        这样,谱聚类能够识别任意形状的样本空间且收敛于全局最优解,其基本思想是利用样本数据的相似矩阵(拉普拉斯矩阵)进行特征分解后得到的特征向量进行聚类。

    1 理论基础

        对于如下空间向量item-user matrix:

    clip_image002

        如果要将item做聚类,常常想到k-means聚类方法,复杂度为o(tknm),t为迭代次数,k为类的个数、n为item个数、m为空间向量特征数:

        1 如果M足够大呢?

        2 K的选取?

        3 类的假设是凸球形的?

        4 如果item是不同的实体呢?

        5 Kmeans无可避免的局部最优收敛?

           ……

        这些都使常见的聚类问题变得相当复杂。

    1.1 图的表示

        如果我们计算出item与item之间的相似度,便可以得到一个只有item的相似矩阵,进一步,将item看成了Graph(G)中Vertex(V),歌曲之间的相似度看成G中的Edge(E),这样便得到我们常见的图的概念。

        对于图的表示(如图2),常用的有:

    邻接矩阵:E,eij表示vi和vi的边的权值,E为对称矩阵,对角线上元素为0,如图2-2。

    Laplacian矩阵:L = D – E, 其中di (行或列元素的和),如图2-3。

    clip_image004图2 图的表示

    1.2 特征值与L矩阵

        先考虑一种最优化图像分割方法,以二分为例,将图cut为S和T两部分,等价于如下损失函数cut(S, T),如公式1所示,即最小(砍掉的边的加权和)。

    clip_image006

        假设二分成两类,S和T,用q(如公式2所示)表示分类情况,且q满足公式3的关系,用于类标识。

        那么:

    clip_image008

        其中D为对角矩阵,行或列元素的和,L为拉普拉斯矩阵。

        由:

    clip_image010clip_image011

        有:

    1、 L为对称半正定矩阵,保证所有特征值都大于等于0;

    2、 L矩阵有唯一的0特征值,其对应的特征向量为1

        离散求解q很困难,如果将问题松弛化为连续实数值,由瑞利熵的性质知其二将你型的最小值就是L的特征值们(最小值,第二小值,......,最大值分别对应矩阵L的最小特征值,第二小特征值,......,最大特征值,且极值q相应的特征向量处取得,请参见瑞利熵(Rayleigh quotient))。

        写到此,不得不对数学家们致敬,将cut(S,T),巧妙地转换成拉普拉斯矩阵特征值(向量)的问题,将离散的聚类问题,松弛为连续的特征向量,最小的系列特征向量对应着图最优的系列划分方法。剩下的仅是将松弛化的问题再离散化,即将特征向量再划分开,便可以得到相应的类别,如将图3中的最小特征向量,按正负划分,便得类{A,B,C}和类{D,E,F,G}。在K分类时,常将前K个特征向量,采用kmeans分类。

        PS

        1、此处虽再次提到kmeans,但意义已经远非引入概念时的讨论的kmeans了,此处的kmeans,更多的是与ensemble learning相关,在此不述;

        2、k与聚类个数并非要求相同,可从第4节的相关物理意义中意会;

        3、在前k个特征向量中,第一列值完全相同(迭代算法计算特征向量时,值极其相近),kmeans时可以删除,同时也可以通过这一列来简易判断求解特征值(向量)方法是否正确,常常问题在于邻接矩阵不对称。

    clip_image012

    图3 图的L矩阵的特征值与特征向量

    2 最优化方法

        在kmeans等其它聚类方法中,很难刻划类的大小关系,局部最优解也是无法回避的漏病。当然这与kmeans的广泛使用相斥——原理简单。

    2.1 Min cut方法

        如2.2节的计算方法,最优目标函数如下的图cut方法:

    clip_image014

        计算方法,可直接由计算L的最小特征值(特征向量),求解。

    2.2 Nomarlized cut方法

        Normarlized cut,目标是同时考虑最小化cut边和划分平衡,以免像图1中的cut出一个单独的H。衡量子图大小的标准是:子图各个端点的Degree之和。

    clip_image016

    2.3 Ratio Cut 方法

        Ratio cut的目标是同时考虑最小化cut边和划分平衡,以免像图1中的cut出一个单独的H。

        最优目标函数为:

    clip_image018

    2.4 Normalized相似变换

        归一化的L矩阵有:

    clip_image020

        因而L的最小特征值与D-(1/2)E D-(1/2)的最大特征值对应。

        而计算的L相比计算L要稍具优势,在具体实用中,常以L替代L,但是min cut和ratio cut不可以。

        PS:这也是常常在人们的博客中,A说谱聚类为求最大K特征值(向量)B说谱聚类为求最小K个特征值(向量的原因)

    3 谱聚类步骤

    第一步:数据准备,生成图的邻接矩阵;

    第二步:归一化普拉斯矩阵;

    第三步:生成最小的k个特征值和对应的特征向量;

    第四步:将特征向量kmeans聚类(少量的特征向量);

    4 谱聚类的物理意义

        谱聚类中的矩阵:

    clip_image022

        可见不管是L、L都与E联系特别大。如果将E看成一个高维向量空间,也能在一定程度上反映item之间的关系。将E直接kmeans聚类,得到的结果也能反映V的聚类特性,而谱聚类的引入L和L是使得G的分割具有物理意义。

        而且,如果E的item(即n)足够大,将难计算出它的kmeans,我们完全可以用PCA降维(仍为top的特征值与向量)。

        上述对将E当成向量空间矩阵,直观地看符合我们的认知,但缺乏理论基础;而L(L等)的引入,如第2节所述,使得计算具有理论基础,其前k个特征向量,也等价于对L(L等)的降维。

        因而聚类就是为图的划分找了理论基础,能达到降维的目的。

    谱聚类算法(Spectral Clustering)优化与扩展

     

        谱聚类(Spectral Clustering, SC)在前面的博文中已经详述,是一种基于图论的聚类方法,简单形象且理论基础充分,在社交网络中广泛应用。本文将讲述进一步扩展其应用场景:首先是User-Item协同聚类,即spectral coclustering,之后再详述谱聚类的进一步优化。

    1 Spectral Coclustering

    1.1 协同聚类(Coclustering)

        在数据分析中,聚类是最常见的一种方法,对于一般的聚类算法(kmeans, spectral clustering, gmm等等),聚类结果都类似图1所示,能挖掘出数据之间的类簇规律。

    image 图1 聚类结果图

        即使对于常见的数据User-Item评分矩阵(常见于各社交平台的数据之中,例如音乐网站的用户-歌曲评分矩阵,新闻网站的用户-新闻评分矩阵,电影网站的用户-电影评分矩阵等等),如表1所示。在聚类分析中,也常常将数据计算成User-User的相似度关系或Item-Item的相似度关系,计算方法诸如应用Jaccard距离,将User或Item分别当成Item或User的特征,再在此基础上计算欧氏距离、cos距离等等。

    clip_image002

    表1 User-Item评分矩阵

        但是如果能聚类成如图2中的coclustering关系,将User和Item同时聚类,将使得数据结果更具意义,即在音乐网站中的用户和歌曲coclustering结果表明,某些用户大都喜欢某类歌曲,同时这类歌曲也大都只被这群用户喜欢着。这样,不管是用于何种场景(例如歌曲推荐),都将带来极大的益处。

    image 图2 coclustering图

    1.2 Spectral Coclustering

        对于User-Item评分矩阵,这是一个典型的二部图(Bipartite Grap),Item-User矩阵A,假设A为N*M,即N个item和M个user,可展开成:

    image 其中E为(M+N)*(M+N)的方阵,且对称。

        对于A的二部图,只存在Item与User之间的邻接边,在Item(User)之间不存在邻接边。再用谱聚类原理——将带权无向图划分为两个或两个以上的最优子图,使子图内部尽量相似,而子图间距离尽量距离较远。这样的聚类结果将Cut尽量少的边,分割出User和Item的类,如果类记Ci(U,I)为第i个由特定的User和Item组成的类,由谱聚类原理,Cut掉的Ci边为中的User或Item与其它类Cj(j≠i)的边,且其满足某种最优Cut方法,简单地说,Cut掉的User到其它类Cj(j≠i)的Item的边,可理解为这些User与其它Item相似关系较小;同样Cut掉的Item到其它类Cj(j≠i)的User的边,可理解为这些Item与其它User相似关系较小。这正好满足coclusering的定义。

     

        在谱聚类的基础上,再实现Spectral Coclustering,十分简单, 将E直接当成谱聚类的邻接矩阵即可,至于求Laplacian矩阵、求特征值、计算Kmeans,完成与谱聚类相同。

        PS:更多详情,请参见参考文献1。

     

    2 谱聚类的半监督学习

        假设有大量新闻需要聚类,但对于其中的部分新闻,编辑已经人工分类好了,例如(Ni1,Ni2, …, Nim),为分类好的第i类,那么对于人工分类好的数据,就相当于聚类中的先验知识(或正则)。

        在聚类时,可相应在邻接矩阵E中增加类彼此间邻接边,并使得其邻接权重较大,这样生成的邻接矩阵为E’。这样,再对此邻接矩阵E’做谱聚类,聚类结果将在一定程度上维持人工分类的结果,并达到聚类的目的。

        PS:更多详情,请参见参考文献2,不过谱聚类的半监督学习,都有点扯。 

    参考文献:

    1 Inderjit S. Dhillon. Co-clustering documents and words using Bipartite Spectral Graph Partitioning;

    2 W Chen. Spectral clustering: A semi-supervised approach;

    3 Wen-Yen Chen, Yangqiu Song, Hongjie Bai, Chih-Jen Lin, Edward Y. Chang. Parallel Spectral Clustering in Distributed Systems.

    ----

  • 相关阅读:
    每日一练leetcode
    每日一练leetcode
    每日一练 leetcode
    每日一练leetcode
    每日一练leetcode
    leetcode每日一练
    BigDecimal类 定义及用法
    每日一练leetcode
    每日一练leetcode
    字符串表达式校验&求值(C#实现) 附代码
  • 原文地址:https://www.cnblogs.com/cleiyang/p/4157787.html
Copyright © 2011-2022 走看看