谱聚类(spectral clustering)原理总结

来源:https://www.cnblogs.com/pinard/p/6221564.html 

   谱聚类(spectral clustering)是广泛使用的聚类算法,比起传统的K-Means算法,谱聚类对数据分布的适应性更强,聚类效果也很优秀,同时聚类的计算量也小很多,更加难能可贵的是实现起来也不复杂。在处理实际的聚类问题时,个人认为谱聚类是应该首先考虑的几种算法之一。下面我们就对谱聚类的算法原理做一个总结。

1. 谱聚类概述

    谱聚类是从图论中演化出来的算法,后来在聚类中得到了广泛的应用。它的主要思想是把所有的数据看做空间中的点,这些点之间可以用边连接起来。距离较远的两个点之间的边权重值较低,而距离较近的两个点之间的边权重值较高,通过对所有数据点组成的图进行切图,让切图后不同的子图间边权重和尽可能的低,而子图内的边权重和尽可能的高,从而达到聚类的目的。

    乍一看,这个算法原理的确简单,但是要完全理解这个算法的话,需要对图论中的无向图,线性代数和矩阵分析都有一定的了解。下面我们就从这些需要的基础知识开始,一步步学习谱聚类。

2. 谱聚类基础之一:无向权重图

    由于谱聚类是基于图论的,因此我们首先温习下图的概念。对于一个图GG,我们一般用点的集合VV和边的集合EE来描述。即为G(V,E)G(V,E)。其中VV即为我们数据集里面所有的点(v1,v2,...vn)(v1,v2,...vn)。对于VV中的任意两个点,可以有边连接,也可以没有边连接。我们定义权重wijwij为点vivi和点vjvj之间的权重。由于我们是无向图,所以wij=wjiwij=wji

    对于有边连接的两个点vivivjvjwij>0wij>0,对于没有边连接的两个点vivivjvjwij=0wij=0。对于图中的任意一个点vivi,它的度didi定义为和它相连的所有边的权重之和,即

di=j=1nwijdi=∑j=1nwij

    利用每个点度的定义,我们可以得到一个nxn的度矩阵DD,它是一个对角矩阵,只有主对角线有值,对应第i行的第i个点的度数,定义如下:

D=d1d2dnD=(d1………d2…⋮⋮⋱……dn)

    利用所有点之间的权重值,我们可以得到图的邻接矩阵WW,它也是一个nxn的矩阵,第i行的第j个值对应我们的权重wijwij

    除此之外,对于点集VV的的一个子集AVA⊂V,我们定义:

|A|:=A|A|:=子集A中点的个数
vol(A):=iAdivol(A):=∑i∈Adi

3. 谱聚类基础之二:相似矩阵

    在上一节我们讲到了邻接矩阵WW,它是由任意两点之间的权重值wijwij组成的矩阵。通常我们可以自己输入权重,但是在谱聚类中,我们只有数据点的定义,并没有直接给出这个邻接矩阵,那么怎么得到这个邻接矩阵呢?

    基本思想是,距离较远的两个点之间的边权重值较低,而距离较近的两个点之间的边权重值较高,不过这仅仅是定性,我们需要定量的权重值。一般来说,我们可以通过样本点距离度量的相似矩阵SS来获得邻接矩阵WW

    构建邻接矩阵WW的方法有三类。ϵϵ-邻近法,K邻近法和全连接法。

    对于ϵϵ-邻近法,它设置了一个距离阈值ϵϵ,然后用欧式距离sijsij度量任意两点xixixjxj的距离。即相似矩阵的sij=||xixj||22sij=||xi−xj||22,  然后根据sijsijϵϵ的大小关系,来定义邻接矩阵WW如下:

Wij={0ϵsij>ϵsijϵWij={0sij>ϵϵsij≤ϵ

    从上式可见,两点间的权重要不就是ϵϵ,要不就是0,没有其他的信息了。距离远近度量很不精确,因此在实际应用中,我们很少使用ϵϵ-邻近法。

    第二种定义邻接矩阵WW的方法是K邻近法,利用KNN算法遍历所有的样本点,取每个样本最近的k个点作为近邻,只有和样本距离最近的k个点之间的wij>0wij>0。但是这种方法会造成重构之后的邻接矩阵W非对称,我们后面的算法需要对称邻接矩阵。为了解决这种问题,一般采取下面两种方法之一:

    第一种K邻近法是只要一个点在另一个点的K近邻中,则保留SijSij

Wij=Wji={0exp(||xixj||222σ2)xiKNN(xj)andxjKNN(xi)xiKNN(xj)orxjKNN(xi)Wij=Wji={0xi∉KNN(xj)andxj∉KNN(xi)exp(−||xi−xj||222σ2)xi∈KNN(xj)orxj∈KNN(xi)

    第二种K邻近法是必须两个点互为K近邻中,才能保留SijSij

Wij=Wji={0exp(||xixj||222σ2)xiKNN(xj)orxjKNN(xi)xiKNN(xj)andxjKNN(xi)Wij=Wji={0xi∉KNN(xj)orxj∉KNN(xi)exp(−||xi−xj||222σ2)xi∈KNN(xj)andxj∈KNN(xi)

    第三种定义邻接矩阵WW的方法是全连接法,相比前两种方法,第三种方法所有的点之间的权重值都大于0,因此称之为全连接法。可以选择不同的核函数来定义边权重,常用的有多项式核函数,高斯核函数和Sigmoid核函数。最常用的是高斯核函数RBF,此时相似矩阵和邻接矩阵相同:

Wij=Sij=exp(||xixj||222σ2)Wij=Sij=exp(−||xi−xj||222σ2)

    在实际的应用中,使用第三种全连接法来建立邻接矩阵是最普遍的,而在全连接法中使用高斯径向核RBF是最普遍的。

4. 谱聚类基础之三:拉普拉斯矩阵

    单独把拉普拉斯矩阵(Graph Laplacians)拿出来介绍是因为后面的算法和这个矩阵的性质息息相关。它的定义很简单,拉普拉斯矩阵L=DWL=D−WDD即为我们第二节讲的度矩阵,它是一个对角矩阵。而WW即为我们第二节讲的邻接矩阵,它可以由我们第三节的方法构建出。

    拉普拉斯矩阵有一些很好的性质如下:

    1)拉普拉斯矩阵是对称矩阵,这可以由DDWW都是对称矩阵而得。

    2)由于拉普拉斯矩阵是对称矩阵,则它的所有的特征值都是实数。

    3)对于任意的向量ff,我们有

fTLf=12i,j=1nwij(fifj)2fTLf=12∑i,j=1nwij(fi−fj)2

      这个利用拉普拉斯矩阵的定义很容易得到如下:

fTLf=fTDffTWf=i=1ndif2ii,j=1nwijfifjfTLf=fTDf−fTWf=∑i=1ndifi2−∑i,j=1nwijfifj
=12(i=1ndif2i2i,j=1nwijfifj+j=1ndjf2j)=12i,j=1nwij(fifj)2=12(∑i=1ndifi2−2∑i,j=1nwijfifj+∑j=1ndjfj2)=12∑i,j=1nwij(fi−fj)2

    4) 拉普拉斯矩阵是半正定的,且对应的n个实数特征值都大于等于0,即0=λ1λ2...λn0=λ1≤λ2≤...≤λn, 且最小的特征值为0,这个由性质3很容易得出。

5. 谱聚类基础之四:无向图切图

    对于无向图GG的切图,我们的目标是将图G(V,E)G(V,E)切成相互没有连接的k个子图,每个子图点的集合为:A1,A2,..AkA1,A2,..Ak,它们满足AiAj=Ai∩Aj=∅,且A1A2...Ak=VA1∪A2∪...∪Ak=V.

    对于任意两个子图点的集合A,BVA,B⊂VAB=A∩B=∅, 我们定义A和B之间的切图权重为:

W(A,B)=iA,jBwijW(A,B)=∑i∈A,j∈Bwij

    那么对于我们k个子图点的集合:A1,A2,..AkA1,A2,..Ak,我们定义切图cut为:

cut(A1,A2,...Ak)=12i=1kW(Ai,A¯¯¯¯i)cut(A1,A2,...Ak)=12∑i=1kW(Ai,A¯i)

     其中A¯¯¯¯iA¯iAiAi的补集,意为除AiAi子集外其他V的子集的并集。

    那么如何切图可以让子图内的点权重和高,子图间的点权重和低呢?一个自然的想法就是最小化cut(A1,A2,...Ak)cut(A1,A2,...Ak), 但是可以发现,这种极小化的切图存在问题,如下图:

    我们选择一个权重最小的边缘的点,比如C和H之间进行cut,这样可以最小化cut(A1,A2,...Ak)cut(A1,A2,...Ak), 但是却不是最优的切图,如何避免这种切图,并且找到类似图中"Best Cut"这样的最优切图呢?我们下一节就来看看谱聚类使用的切图方法。

6. 谱聚类之切图聚类

    为了避免最小切图导致的切图效果不佳,我们需要对每个子图的规模做出限定,一般来说,有两种切图方式,第一种是RatioCut,第二种是Ncut。下面我们分别加以介绍。

6.1 RatioCut切图

    RatioCut切图为了避免第五节的最小切图,对每个切图,不光考虑最小化cut(A1,A2,...Ak)cut(A1,A2,...Ak),它还同时考虑最大化每个子图点的个数,即:

RatioCut(A1,A2,...Ak)=12i=1kW(Ai,A¯¯¯¯i)|Ai|RatioCut(A1,A2,...Ak)=12∑i=1kW(Ai,A¯i)|Ai|

    那么怎么最小化这个RatioCut函数呢?牛人们发现,RatioCut函数可以通过如下方式表示。

    我们引入指示向量hj={h1,h2,..hk}j=1,2,...khj={h1,h2,..hk}j=1,2,...k,对于任意一个向量hjhj, 它是一个n维向量(n为样本数),我们定义hjihji为:

hji=01|Aj|viAjviAjhji={0vi∉Aj1|Aj|vi∈Aj

    那么我们对于hTiLhihiTLhi,有:

hTiLhi=12m=1n=1wmn(himhin)2=12(mAi,nAiwmn(1|Ai|0)2+mAi,nAiwmn(01|Ai|)2=12(mAi,nAiwmn1|Ai|+mAi,nAiwmn1|Ai|=12(cut(Ai,A¯¯¯¯i)1|Ai|+cut(A¯¯¯¯i,Ai)1|Ai|)=cut(Ai,A¯¯¯¯i)|Ai|=RatioCut(Ai,A¯¯¯¯i)(1)(2)(3)(4)(5)(6)(1)hiTLhi=12∑m=1∑n=1wmn(him−hin)2(2)=12(∑m∈Ai,n∉Aiwmn(1|Ai|−0)2+∑m∉Ai,n∈Aiwmn(0−1|Ai|)2(3)=12(∑m∈Ai,n∉Aiwmn1|Ai|+∑m∉Ai,n∈Aiwmn1|Ai|(4)=12(cut(Ai,A¯i)1|Ai|+cut(A¯i,Ai)1|Ai|)(5)=cut(Ai,A¯i)|Ai|(6)=RatioCut(Ai,A¯i)

    上述第(1)式用了上面第四节的拉普拉斯矩阵的性质3. 第二式用到了指示向量的定义。可以看出,对于某一个子图i,它的RatioCut对应于hTiLhihiTLhi,那么我们的k个子图呢?对应的RatioCut函数表达式为:

RatioCut(A1,A2,...Ak)=i=1khTiLhi=i=1k(HTLH)ii=tr(HTLH)RatioCut(A1,A2,...Ak)=∑i=1khiTLhi=∑i=1k(HTLH)ii=tr(HTLH)

    其中tr(HTLH)tr(HTLH)为矩阵的迹。也就是说,我们的RatioCut切图,实际上就是最小化我们的tr(HTLH)tr(HTLH)。注意到HTH=IHTH=I,则我们的切图优化目标为:

argminHtr(HTLH)s.t.HTH=Iargmin⏟Htr(HTLH)s.t.HTH=I

    注意到我们H矩阵里面的每一个指示向量都是n维的,向量中每个变量的取值为0或者1|Aj|1|Aj|,就有2n2n种取值,有k个子图的话就有k个指示向量,共有k2nk2n种H,因此找到满足上面优化目标的H是一个NP难的问题。那么是不是就没有办法了呢?

    注意观察tr(HTLH)tr(HTLH)中每一个优化子目标hTiLhihiTLhi,其中hh是单位正交基, L为对称矩阵,此时hTiLhihiTLhi的最大值为L的最大特征值,最小值是L的最小特征值。如果你对主成分分析PCA很熟悉的话,这里很好理解。在PCA中,我们的目标是找到协方差矩阵(对应此处的拉普拉斯矩阵L)的最大的特征值,而在我们的谱聚类中,我们的目标是找到目标的最小的特征值,得到对应的特征向量,此时对应二分切图效果最佳。也就是说,我们这里要用到维度规约的思想来近似去解决这个NP难的问题。

    对于hTiLhihiTLhi,我们的目标是找到最小的L的特征值,而对于tr(HTLH)=i=1khTiLhitr(HTLH)=∑i=1khiTLhi,则我们的目标就是找到k个最小的特征值,一般来说,k远远小于n,也就是说,此时我们进行了维度规约,将维度从n降到了k,从而近似可以解决这个NP难的问题。

    通过找到L的最小的k个特征值,可以得到对应的k个特征向量,这k个特征向量组成一个nxk维度的矩阵,即为我们的H。一般需要对H矩阵按行做标准化,即

hij=hij(t=1kh2it)1/2hij∗=hij(∑t=1khit2)1/2

    由于我们在使用维度规约的时候损失了少量信息,导致得到的优化后的指示向量h对应的H现在不能完全指示各样本的归属,因此一般在得到nxk维度的矩阵H后还需要对每一行进行一次传统的聚类,比如使用K-Means聚类.

6.2 Ncut切图

    Ncut切图和RatioCut切图很类似,但是把Ratiocut的分母|Ai||Ai|换成vol(Ai)vol(Ai). 由于子图样本的个数多并不一定权重就大,我们切图时基于权重也更合我们的目标,因此一般来说Ncut切图优于RatioCut切图。

NCut(A1,A2,...Ak)=12i=1kW(Ai,A¯¯¯¯i)vol(Ai)NCut(A1,A2,...Ak)=12∑i=1kW(Ai,A¯i)vol(Ai)

    ,对应的,Ncut切图对指示向量hh做了改进。注意到RatioCut切图的指示向量使用的是1|Aj|1|Aj|标示样本归属,而Ncut切图使用了子图权重1vol(Aj)1vol(Aj)来标示指示向量h,定义如下:

hji=01vol(Aj)viAjviAjhji={0vi∉Aj1vol(Aj)vi∈Aj

    那么我们对于hTiLhihiTLhi,有:

hTiLhi=12m=1n=1wmn(himhin)2=12(mAi,nAiwmn(1vol(Aj)0)2+mAi,nAiwmn(01vol(Aj))2=12(mAi,nAiwmn1vol(Aj)+mAi,nAiwmn1vol(Aj)=12(cut(Ai,A¯¯¯¯i)1vol(Aj)+cut(A¯¯¯¯i,Ai)1vol(Aj))=cut(Ai,A¯¯¯¯i)vol(Aj)=NCut(Ai,A¯¯¯¯i)(7)(8)(9)(10)(11)(12)(7)hiTLhi=12∑m=1∑n=1wmn(him−hin)2(8)=12(∑m∈Ai,n∉Aiwmn(1vol(Aj)−0)2+∑m∉Ai,n∈Aiwmn(0−1vol(Aj))2(9)=12(∑m∈Ai,n∉Aiwmn1vol(Aj)+∑m∉Ai,n∈Aiwmn1vol(Aj)(10)=12(cut(Ai,A¯i)1vol(Aj)+cut(A¯i,Ai)1vol(Aj))(11)=cut(Ai,A¯i)vol(Aj)(12)=NCut(Ai,A¯i)

    推导方式和RatioCut完全一致。也就是说,我们的优化目标仍然是

NCut(A1,A2,...Ak)=i=1khTiLhi=i=1k(HTLH)ii=tr(HTLH)NCut(A1,A2,...Ak)=∑i=1khiTLhi=∑i=1k(HTLH)ii=tr(HTLH)

    但是此时我们的HTHIHTH≠I,而是HTDH=IHTDH=I。推导如下:

hTiDhi=j=1nh2ijdj=1vol(Ai)vjAiwvj=1vol(Ai)vol(Ai)=1hiTDhi=∑j=1nhij2dj=1vol(Ai)∑vj∈Aiwvj=1vol(Ai)vol(Ai)=1

    也就是说,此时我们的优化目标最终为:

argminHtr(HTLH)s.t.HTDH=Iargmin⏟Htr(HTLH)s.t.HTDH=I

    此时我们的H中的指示向量hh并不是标准正交基,所以在RatioCut里面的降维思想不能直接用。怎么办呢?其实只需要将指示向量矩阵H做一个小小的转化即可。

    我们令H=D1/2FH=D−1/2F, 则:HTLH=FTD1/2LD1/2FHTLH=FTD−1/2LD−1/2FHTDH=FTF=IHTDH=FTF=I,也就是说优化目标变成了:

argminFtr(FTD1/2LD1/2F)s.t.FTF=Iargmin⏟Ftr(FTD−1/2LD−1/2F)s.t.FTF=I

    可以发现这个式子和RatioCut基本一致,只是中间的L变成了D1/2LD1/2D−1/2LD−1/2。这样我们就可以继续按照RatioCut的思想,求出D1/2LD1/2D−1/2LD−1/2的最小的前k个特征值,然后求出对应的特征向量,并标准化,得到最后的特征矩阵FF,最后对FF进行一次传统的聚类(比如K-Means)即可。

    一般来说, D1/2LD1/2D−1/2LD−1/2相当于对拉普拉斯矩阵LL做了一次标准化,即LijdidjLijdi∗dj

7. 谱聚类算法流程

    铺垫了这么久,终于可以总结下谱聚类的基本流程了。一般来说,谱聚类主要的注意点为相似矩阵的生成方式(参见第二节),切图的方式(参见第六节)以及最后的聚类方法(参见第六节)。

    最常用的相似矩阵的生成方式是基于高斯核距离的全连接方式,最常用的切图方式是Ncut。而到最后常用的聚类方法为K-Means。下面以Ncut总结谱聚类算法流程。

    输入:样本集D=(x1,x2,...,xn)(x1,x2,...,xn),相似矩阵的生成方式, 降维后的维度k1k1, 聚类方法,聚类后的维度k2k2

    输出: 簇划分C(c1,c2,...ck2)C(c1,c2,...ck2). 

    1) 根据输入的相似矩阵的生成方式构建样本的相似矩阵S

    2)根据相似矩阵S构建邻接矩阵W,构建度矩阵D

    3)计算出拉普拉斯矩阵L

    4)构建标准化后的拉普拉斯矩阵D1/2LD1/2D−1/2LD−1/2

    5)计算D1/2LD1/2D−1/2LD−1/2最小的k1k1个特征值所各自对应的特征向量ff

    6) 将各自对应的特征向量ff组成的矩阵按行标准化,最终组成n×k1n×k1维的特征矩阵F

    7)对F中的每一行作为一个k1k1维的样本,共n个样本,用输入的聚类方法进行聚类,聚类维数为k2k2

    8)得到簇划分C(c1,c2,...ck2)C(c1,c2,...ck2).         

8. 谱聚类算法总结

    谱聚类算法是一个使用起来简单,但是讲清楚却不是那么容易的算法,它需要你有一定的数学基础。如果你掌握了谱聚类,相信你会对矩阵分析,图论有更深入的理解。同时对降维里的主成分分析也会加深理解。

    下面总结下谱聚类算法的优缺点。

    谱聚类算法的主要优点有:

    1)谱聚类只需要数据之间的相似度矩阵,因此对于处理稀疏数据的聚类很有效。这点传统聚类算法比如K-Means很难做到

    2)由于使用了降维,因此在处理高维数据聚类时的复杂度比传统聚类算法好。

    谱聚类算法的主要缺点有:

    1)如果最终聚类的维度非常高,则由于降维的幅度不够,谱聚类的运行速度和最后的聚类效果均不好。

    2) 聚类效果依赖于相似矩阵,不同的相似矩阵得到的最终聚类效果可能很不同。

 

(欢迎转载,转载请注明出处。欢迎沟通交流: liujianping-ok@163.com)

谱聚类spectral clustering)是一种基于图论的聚类算法,适用于无法使用传统聚类算法(如K-means)有效划分的数据。谱聚类的核心思想是将数据集转换成图形结构,利用图的谱分解来实现聚类。 在Python中,有一个常用的谱聚类库是scikit-learn的`SpectralClustering`。该库提供了一种简单且高效的方法来执行谱聚类。 使用`SpectralClustering`库进行谱聚类的步骤如下: 1. 导入库:首先需要导入`SpectralClustering`库。 ```python from sklearn.cluster import SpectralClustering ``` 2. 创建模型:使用`SpectralClustering`函数创建一个谱聚类模型对象,并传入相关参数。 ```python model = SpectralClustering(n_clusters=2, affinity='nearest_neighbors') ``` 其中,`n_clusters`表示需要聚类的簇数,`affinity`表示相似度的计算方法,常用的选项包括`nearest_neighbors`和`rbf`。 3. 训练模型:使用`fit`函数训练模型,传入需要进行聚类的数据。 ```python model.fit(data) ``` 4. 获取聚类结果:通过访问模型的`labels_`属性,可以获取到每个样本的聚类标签。 ```python cluster_labels = model.labels_ ``` 聚类标签是一个表示每个样本所属簇的数组。 总结来说,Python的谱聚类库提供了一个方便而有效的方式来执行谱聚类。通过导入库、创建模型、训练模型和获取聚类结果的步骤,可以轻松地使用谱聚类算法对数据进行聚类分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值