谱聚类
谱聚类在最近几年变得受欢迎起来,主要原因就是它实现简单,聚类效果经常优于传统的聚类算法(如K-Means算法)。刚开始学习谱聚类的时候,给人的感觉就是这个算法看上去很难,但是当真正的深入了解这个算法的时候,其实它的原理并不难,但是理解该算法还是需要一定的数学基础的。如果掌握了谱聚类算法,会对矩阵分析,图论和降维中的主成分分析等有更加深入的理解。
1、谱聚类概述
谱聚类(Spectral Clustering, SC)是一种基于图论的聚类方法——将带权无向图划分为两个或两个以上的最优子图,使子图内部尽量相似,而子图间距离尽量距离较远,以达到常见的聚类的目的。其中的最优是指最优目标函数不同,可以是割边最小分割, 也可以是分割规模差不多且割边最小的分割。
谱聚类通过对样本数据的拉普拉斯矩阵的特征向量进行聚类,从而对样本数据聚类。谱聚类可以理解为将高维空间的数据映射到低维,然后在低维空间用其它聚类算法(如K-Means)进行聚类。
1.1、简单说明
谱聚类过程主要有两步,第一步是构图,将采样点数据构造成一张网图,表示为G(V,E),V表示图中的点,E表示点与点之间的边,如下图:
第二步是切图,即将第一步构造出来的按照一定的切边准则,切分成不同的图,而不同的子图,即我们对应的聚类结果,举例如下:
2、数学准备
2.1、谱
方阵作为线性算子,它的所有特征值的全体统称为方阵的谱。方阵的谱半径为最大的特征值。矩阵A的谱半径是矩阵ATA的最大特征值。
2.2、无向权重图
对于一个图G,我们一般用点的集合V和边的集合E来描述。即为G(V,E)。其中V即为我们数据集里面所有的点(v1,v2,…vn)。对于V中的任意两个点,可以有边连接,也可以没有边连接。我们定义权重wij为点vi和点vj之间的权重。由于我们是无向图,所以wij=wji。
对于有边连接的两个点vi和vj,wij>0,对于没有边连接的两个点vi和vj,wij=0。对于图中的任意一个点vi,它的度di定义为和它相连的所有边的权重之和,即di =j wij
利用每个点度的定义,我们可以得到一个nxn的度矩阵D,它是一个对角矩阵,只有主对角线有值,对应第i行的第i个点的度数。
利用所有点之间的权重值,我们可以得到图的邻接矩阵W,它也是一个nxn的矩阵,第i行的第j个值对应我们的权重wij。
2.3、相似矩阵
相似矩阵就是样本点中的任意两个点之间的距离度量,在聚类算法中可以表示为距离近的点它们之间的相似度比较高,而距离较远的点它们的相似度比较低,甚至可以忽略。这里用三种方式表示相似度矩阵:一是ϵ-近邻法(ϵ-neighborhood graph),二是k近邻法(k-nearest nerghbor graph),三是全连接法(fully connected graph)。下面我们来介绍这三种方法。
2.3.1、ϵ-neighborhood graph:
样本点中任意两点之间的欧式距离:
用此方法构造的相似度矩阵表示如下:
该相似度矩阵由于距离近的点的距离表示为,距离远的点距离表示为0,矩阵种没有携带关于数据集的太多的信息,所以该方法一般很少使用,在sklearn中也没有使用该方法。
2.3.2、k-nearest nerghbor graph:
由于每个样本点的k个近邻可能不是完全相同的,所以用此方法构造的相似度矩阵并不是对称的。因此,这里使用两种方式表示对称的knn相似度矩阵,第一种方式是如果vi在vj的k个邻域中 或者 vj在vi的k个邻域中,则wij=wji为vi与vj之间的距离,否则为0;第二种方式是如果vi在vj的k个邻域中 并且 vj在vi的k个邻域中,则wij=wji为vi与vj之间的距离,否则为0。很显然第二种方式比第一种方式生成的相似度矩阵要稀疏。这两种方式用公式表达如下:
第一种方式:
第二种方式:
2.3.3、fully connected graph:
该方法就是在算法描述中的高斯相似度方法,公式如下:
该方法也是最常用的方法,在sklearn中默认的也是该方法,表示任意两个样本点都有相似度,但是距离较远的样本点之间相似度较低,甚至可以忽略。这里面的参数控制着样本点的邻域宽度,即越大表示样本点与距离较远的样本点的相似度越大,反之亦然。
2.4、拉普拉斯矩阵
单独把拉普拉斯矩阵(Graph Laplacians)拿出来介绍是因为后面的算法和这个矩阵的性质息息相关。它的定义很简单,拉普拉斯矩阵L=D−W。D即为度矩阵,它是一个对角矩阵。而W即为邻接矩阵,它可以通过相似矩阵构建出。
拉普拉斯矩阵有一些很好的性质如下:
1)拉普拉斯矩阵是对称矩阵,这可以由D和W都是对称矩阵而得。
2)由于拉普拉斯矩阵是对称矩阵,则它的所有的特征值都是实数。
3)对于任意的向量f,我们有
证明:
4) 拉普拉斯矩阵是半正定的,且对应的n个实数特征值都大于等于0,即0=λ1≤λ2≤…≤λn, 且最小的特征值为0:
令表示n*1的全1向量,则
由D和W的定义可以得出上式。
3、切图聚类
3.1、切图
对于无向图G的切图,我们的目标是将图G(V,E)切成相互没有连接的k个子图,每个子图点的集合为:A1,A2,…Ak,它们满足Ai∩Aj=∅,且A1∪A2∪…∪Ak=V.
对于任意两个子图点的集合A,B⊂V, A∩B=∅, 我们定义A和B之间的切图权重为:
那么对于我们k个子图点的集合:A1,A2,…Ak,我们定义切图cut为:
其中i为Ai的补集,意为除Ai子集外其他V的子集的并集。
那么如何切图可以让子图内的点权重和高,子图间的点权重和低呢?一个自然的想法就是最小化cut(A1,A2,…Ak), 但是可以发现,这种极小化的切图存在问题,如下图:
我们选择一个权重最小的边缘的点,比如C和H之间进行cut,这样可以最小化cut(A1,A2,…Ak), 但是却不是最优的切图,如何避免这种切图,并且找到类似图中"Best Cut"这样的最优切图呢?
3.2、三种切图方法
3.2.1、最小切(mincut)
即最小化cut(A1,A2,…Ak)
3.2.2、RatioCut切图
RatioCut切图为了避免最小切图,对每个切图,不光考虑最小化cut(A1,A2,…Ak),它还同时考虑最大化每个子图点的个数,即:
最小化这个RatioCut函数:
我们引入指示向量hj∈{h1,h2,…hk}j=1,2,…k,对于任意一个向量hj, 它是一个n维向量(n为样本数),我们定义hij为:
那么我们对于Lhi,有:
上述用了上面的拉普拉斯矩阵的性质以及指示向量的定义。可以看出,对于某一个子图i,它的RatioCut对应于Lhi,那么我们的k个子图呢?对应的RatioCut函数表达式为:
其中tr(HTLH)为矩阵的迹。也就是说,我们的RatioCut切图,实际上就是最小化我们的tr(HTLH)。注意到HTH=I,则我们的切图优化目标为:
注意到我们H矩阵里面的每一个指示向量都是n维的,向量中每个变量的取值为0或者,就有2n种取值,有k个子图的话就有k个指示向量,共有k2n种H,因此找到满足上面优化目标的H是一个NP难的问题。那么是不是就没有办法了呢?
注意观察tr(HTLH)中每一个优化子目标Lhi,其中h是单位正交基, L为对称矩阵,此时Lhi的最大值为L的最大特征值,最小值是L的最小特征值。如果你对主成分分析PCA很熟悉的话,这里很好理解。在PCA中,我们的目标是找到协方差矩阵(对应此处的拉普拉斯矩阵L)的最大的特征值,而在我们的谱聚类中,我们的目标是找到目标的最小的特征值,得到对应的特征向量,此时对应二分切图效果最佳。也就是说,我们这里要用到维度规约的思想来近似去解决这个NP难的问题。
对于Lhi,我们的目标是找到最小的L的特征值,而对于tr(HTLH)=Lhi,则我们的目标就是找到k个最小的特征值,一般来说,k远远小于n,也就是说,此时我们进行了维度规约,将维度从n降到了k,从而近似可以解决这个NP难的问题。
通过找到L的最小的k个特征值,可以得到对应的k个特征向量,这k个特征向量组成一个nxk维度的矩阵,即为我们的H。一般需要对H矩阵按行做标准化,即
由于我们在使用维度规约的时候损失了少量信息,导致得到的优化后的指示向量h对应的H现在不能完全指示各样本的归属,因此一般在得到nxk维度的矩阵H后还需要对每一行进行一次传统的聚类,比如使用K-Means聚类.
3.2.3、Ncut切图
Ncut切图和RatioCut切图很类似,但是把Ratiocut的分母|Ai|换成vol(Ai). 由于子图样本的个数多并不一定权重就大,我们切图时基于权重也更合我们的目标,因此一般来说Ncut切图优于RatioCut切图。
对应的,Ncut切图对指示向量h做了改进。注意到RatioCut切图的指示向量使用的是标示样本归属,而Ncut切图使用了子图权重来标示指示向量h,定义如下:
那么我们对于Lhi,有:
推导方式和RatioCut完全一致。也就是说,我们的优化目标仍然是:
但是此时我们的HTH≠I,而是HTDH=I。推导如下:
也就是说,此时我们的优化目标最终为:
此时我们的H中的指示向量h并不是标准正交基,所以在RatioCut里面的降维思想不能直接用。怎么办呢?其实只需要将指示向量矩阵H做一个小小的转化即可。
我们令H=D−1/2F, 则:HTLH=FTD−1/2LD−1/2F,HTDH=FTF=I,也就是说优化目标变成了:
可以发现这个式子和RatioCut基本一致,只是中间的L变成了D−1/2LD−1/2。这样我们就可以继续按照RatioCut的思想,求出D−1/2LD−1/2的最小的前k个特征值,然后求出对应的特征向量,并标准化,得到最后的特征矩阵F,最后对F进行一次传统的聚类(比如K-Means)即可。
一般来说, D−1/2LD−1/2相当于对拉普拉斯矩阵L做了一次标准化,即
4、谱聚类流程
第一步:数据准备,生成图的邻接矩阵;
第二步:归一化普拉斯矩阵;
第三步:生成最小的k个特征值和对应的特征向量;
第四步:将特征向量kmeans聚类(少量的特征向量);
一般来说,谱聚类主要的注意点为相似矩阵的生成方式,切图的方式以及最后的聚类方法。
具体介绍一下:
最常用的相似矩阵的生成方式是基于高斯核距离的全连接方式,最常用的切图方式是Ncut。而到最后常用的聚类方法为K-Means。下面以Ncut总结谱聚类算法流程。
输入:样本集D=(x1,x2,…,xn),相似矩阵的生成方式, 降维后的维度k1, 聚类方法,聚类后的维度k2
输出: 簇划分C(c1,c2,…)
1)根据输入的相似矩阵的生成方式构建样本的相似矩阵S
2)根据相似矩阵S构建邻接矩阵W,构建度矩阵D
3)计算出拉普拉斯矩阵L
4)构建标准化后的拉普拉斯矩阵D−1/2LD−1/2
5)计算D−1/2LD−1/2最小的k1个特征值所各自对应的特征向量f
6)将各自对应的特征向量f组成的矩阵按行标准化,最终组成n×k1维的特征矩阵F
7)对F中的每一行作为一个k1维的样本,共n个样本,用输入的聚类方法进行聚类,聚类维数为k2。
8)得到簇划分C(c1,c2,…).
5、谱聚类优缺点
优点
(1)当聚类的类别个数较小的时候,谱聚类的效果会很好,但是当聚类的类别个数较大的时候,则不建议使用谱聚类;
(2)谱聚类算法使用了降维的技术,所以更加适用于高维数据的聚类;
(3)谱聚类只需要数据之间的相似度矩阵,因此对于处理稀疏数据的聚类很有效。这点传统聚类算法(比如K-Means)很难做到
(4)谱聚类算法建立在谱图理论基础上,与传统的聚类算法相比,它具有能在任意形状的样本空间上聚类且收敛于全局最优解
缺点
(1)谱聚类对相似度图的改变和聚类参数的选择非常的敏感;
(2)谱聚类适用于均衡分类问题,即各簇之间点的个数相差不大,对于簇之间点个数相差悬殊的聚类问题,谱聚类则不适用;
6、python实现
import numpy
import scipy
from sklearn.cluster import KMeans
def laplacian(A):
"""Computes the symetric normalized laplacian.
L = D^{-1/2} A D{-1/2}
"""
D = numpy.zeros(A.shape)
w = numpy.sum(A, axis=0)
D.flat[::len(w) + 1] = w ** (-0.5) # set the diag of D to w
return D.dot(A).dot(D)
def k_means(X, n_clusters):
kmeans = KMeans(n_clusters=n_clusters, random_state=1231)
return kmeans.fit(X).labels_
def spectral_clustering(affinity, n_clusters, cluster_method=k_means):
L = laplacian(affinity)
eig_val, eig_vect = scipy.sparse.linalg.eigs(L, n_clusters)
X = eig_vect.real
rows_norm = numpy.linalg.norm(X, axis=1, ord=2)
Y = (X.T / rows_norm).T
labels = cluster_method(Y, n_clusters)
return labels
```