谱聚类算法是我论文实验部分的对比算法,一对比发现,谱聚类真的太强了,聚类效果很好,对不同的数据分布有很强的适应性,速度还快。下文全部参考 https://www.cnblogs.com/pinard/p/6221564.html,写得太棒了,自己再敲一遍加深印象。
虽然是转载,但加了少许标注:-)
1.谱聚类概述
主要思想是把所有数据点看做空间中的点,点之间可以用线相连,即边,边有权重。距离远的点,边的权重小;距离近,边权重大。对所有数据点组成的图进行切割,使得子图内部的所有边的权重之和相对较大,子图之间的权重之和尽可能小,以达到聚类目的。
2.谱聚类基础:无向权重图
对于一个图G,我们一般描述为G(V,E)。V为点集,E为边集。对于V中的任意两个点,可以有边连接,也可以没有边连接。我们定义权重wij为点vi和点vj之间的权重,且wij=wji。对于有边连接的两个点,wij>0;对于没有边连接的两个点,wij=0。对于图中的任意一个点vi,它的度di定义为 与它相连的所有边的权重之和,即
利用每个点的度的定义,得到一个n×n的对角矩阵,n为数据集的点的数目。主对角线有值,对应第i行的第i个点的度数
利用边的权重值,也可以得到一个n×n的矩阵W,第i行的第j个值对应我们的权重wij
3.谱聚类基础:相似矩阵
首先,可以通过样本点距离度量得到相似矩阵S,,就是欧氏距离的对称矩阵
然后,定义边的权重wij。有三种方法:ϵ-邻近法,K邻近法和全连接法。
第一种:ϵ-邻近法,它设置了一个距离阈值ϵ,然后用欧式距离计算任意两点xi和xj的距离。
也就是点与点之间边的权重,不是0就是ϵ,这样距离远近度量很不精确,太草率了
第二种:K邻近法,利用KNN算法遍历所有的样本点,取每个样本点最近的k个点作为近邻,只有这k个点的wij>0。但是这种方法会造成邻接矩阵W非对称(因为点i作为样本点,j是它k个近邻点中的一个;相反,i未必是样本点j的k个近邻中的一个),但后面的算法是需要对称的邻接矩阵。所以可以采取下面两种方法:
①只要一个点在另一个点的K近邻中,则保留sij
②只有两个点互在对方的近邻中,才保留sij
第三种:全连接法,相比前两种方法,第三种方法所有的点之间的权重值都大于0,因此称之为全连接法。可以选择不同的核函数来定义边权重,常用的有多项式核函数,高斯核函数和Sigmoid核函数。最常用的是高斯核函数RBF,此时相似矩阵和邻接矩阵相同:
4.谱聚类基础:拉普拉斯矩阵
拉普拉斯矩阵L=D−W,D即为我们第二节讲的度矩阵,它是一个对角矩阵。而W即为我们第二节讲的邻接矩阵,它可以由我们第三节的方法构建出。
拉普拉斯矩阵有一些很好的性质如下:
1)拉普拉斯矩阵是对称矩阵,这可以由D和W都是对称矩阵而得。
2)由于拉普拉斯矩阵是对称矩阵,则它的所有的特征值都是实数。
3)对于任意的向量f,我们有
推导如下:
4) 拉普拉斯矩阵是半正定的,且对应的n个实数特征值都大于等于0,即0=λ1≤λ2≤...≤λn,且最小的特征值为0,这个由性质3很容易得出。
5.谱聚类基础:无向图切图
对于无向图G的切图,我们的目标是将图G(V,E)切成相互没有连接的k个子图,每个子图点的集合为:A1,A2,..Ak,它们满足Ai∩Aj=∅, 且A1∪A2∪...∪Ak=V.
对于任意两个子图点的集合A,B,我们定义A和B之间的切图权重为:(对于所有点i∈A,j∈B,累加权重)
对于我们k个子图点的集合:A1,A2,..Ak,我们定义切图cut为:(即对每个子图,计算其余所有子图与其之间的权重,算了两遍,所以除以2)
那么如何切图可以让子图内的点权重和高,子图间的点权重和低呢?一个自然的想法就是最小化cut(A1,A2,...Ak),但是可以发现,这种极小化的切图存在问题,如下图:
最小化cut,会使C H两点分开,而好的切图,应该在中间位置。因此需要bestcut
6.谱聚类之切图聚类
有两种切图方式:第一种是RatioCut,第二种是Ncut。
6.1RatioCut
RatioCut切图为了避免第五节的最小切图,对每个切图,不光考虑最小化cut(A1,A2,...Ak),它还同时考虑最大化每个子图点的个数,即:
也就是让RatioCut整个函数最小化。RatioCut函数可以通过如下方式表示。
我们引入指示向量,对于任意一个向量hj , 它是一个n维向量(n为样本数),我们定义hij为:
基本就是这个样子(n×k),每一行就只有一个非零元素
对于,(其中m,n∈[1,k]),有
上述(1)式用了上面第四节的拉普拉斯矩阵的性质3. 第二式用到了指示向量的定义。可以看出,对于某一个子图i,它的RatioCut对应于,那么我们的k个子图呢?对应的RatioCut函数表达式为:
其中为矩阵的迹。也就是说,我们的RatioCut切图,实际上就是最小化我们的
。注意到
,则我们的切图优化目标为:
注意到我们H矩阵里面的每一个指示向量都是n维的,向量中每个变量的取值为0或者,有2^n种取值;有k个子图的话就有k个指示向量,共有k·2^n种H,因此找到满足上面优化目标的H是一个NP难的问题。那么是不是就没有办法了呢?
注意观察中每一个优化子目标
,其中h是单位正交基, L为对称矩阵,此时
的最大值为L的最大特征值,最小值是L的最小特征值。如果你对主成分分析PCA很熟悉的话,这里很好理解。在PCA中,我们的目标是找到协方差矩阵(对应此处的拉普拉斯矩阵L)的最大的特征值,而在我们的谱聚类中,我们的目标是找到目标的最小的特征值,得到对应的特征向量,此时对应二分切图效果最佳。也就是说,我们这里要用到维度规约(降维)的思想来近似去解决这个NP难的问题。
对于,我们的目标是找到最小的L的特征值,而对于
,则我们的目标就是找到k个最小的特征值,一般来说,k远远小于n,也就是说,此时我们进行了维度规约,将维度从n降到了k(n是数据点数目,k是子图个数),从而近似可以解决这个NP难的问题。(原来是横着找,现在竖着找)
通过找到L的最小的k个特征值,可以得到对应的k个特征向量,这k个特征向量组成一个nxk维度的矩阵,即为我们的H。一般需要对H矩阵按行做标准化,即
由于我们在使用维度规约的时候损失了少量信息,导致得到的优化后的指示向量h对应的H现在不能完全指示各样本的归属,因此一般在得到nxk维度的矩阵H后还需要对每一行进行一次传统的聚类,比如使用K-Means聚类.
6.2 Ncut切图
把Ratiocut的分母|Ai|换成vol(Ai),即子集A中所有点的度的和. 由于子图样本的个数多并不一定权重就大,我们切图时基于权重也更合理,因此一般来说Ncut切图优于RatioCut切图。
对指示向量也做了改进,
对于,
推导方式和RatioCut完全一致。也就是说,我们的优化目标仍然是
此时,我们的推导如下:
因此,最终的优化目标是
此时我们的H中的指示向量h并不是标准正交基,所以在RatioCut里面的降维思想不能直接用。怎么办呢?其实只需要将指示向量矩阵H做一个小小的转化即可。
这样与RatioCut基本一致,只是L变成了。这样就可以继续按照RatioCut的方法,计算
的最小前k个特征值,然后求出对应的特征向量,标准化,然后得到最后的特征矩阵F,然后对F进行一次传统的聚类,如K-means
一般来说,相当于对拉普拉斯矩阵L做了一次标准化,即
。
7.谱聚类算法流程
输入:样本集D=(x1,x2,...,xn),相似矩阵的生成方式, 降维后的维度k1(切成k1子图), 聚类方法,聚类后的维度k2(聚成k2个类)
输出: 簇划分C(c1,c2,...ck2)
1) 根据输入的相似矩阵的生成方式构建样本的相似矩阵S
2)根据相似矩阵S构建邻接矩阵W,构建度矩阵D
3)计算出拉普拉斯矩阵L
4)构建标准化后的拉普拉斯矩阵
5)计算最小的k1个特征值所各自对应的特征向量f
6) 将各自对应的特征向量f组成的矩阵按行标准化,最终组成n×k1维的特征矩阵F
7)对F中的每一行作为一个k1维的样本,共n个样本,用输入的聚类方法进行聚类,聚类维数为k2。(也就是F是一个输入矩阵,有n个样本,每个样本的维度是k1)
8)得到簇划分C(c1,c2,...ck2)
8.谱聚类总结
下面总结下谱聚类算法的优缺点。
谱聚类算法的主要优点有:
1)谱聚类只需要数据之间的相似度矩阵,因此对于处理稀疏数据的聚类很有效。这点传统聚类算法比如K-Means很难做到
2)由于使用了降维,因此在处理高维数据聚类时的复杂度比传统聚类算法好。
谱聚类算法的主要缺点有:
1)如果最终聚类的维度非常高,则由于降维的幅度不够,谱聚类的运行速度和最后的聚类效果均不好。
2) 聚类效果依赖于相似矩阵,不同的相似矩阵得到的最终聚类效果可能很不同。