转载:https://www.jianshu.com/p/0e59e944a3ff
http://www.datasciencelab.cn/clustering/spectral
https://www.jianshu.com/p/881f5dd4c209 (公式推导)
1. 相关概念科普
度矩阵
度矩阵为对角矩阵,对角线上的值表示 与该点 有来往的 其他点的个数 即度 为 与节点 相连的 个数
邻接矩阵
邻接矩阵 表示图上 各点之间 是否有联系或者联系程度, 可以是 1/0 也可以是 具体权值
laplas2
拉普拉斯矩阵
图论中的的 拉普拉斯矩阵(也被称为导纳矩阵/吉尔霍夫矩阵/离散拉普拉斯)是图的矩阵表示. 它是 度矩阵 和 邻接矩阵 的差. 拉普拉斯矩阵 结合 吉尔霍夫理论 可以用来计算图的最小生成树的个数。
拉普拉斯矩阵还可用来寻找图的其他属性: 谱图理论(spectral graph theory)
黎曼几何的Cheeger不等式有涉及了拉普拉斯矩阵的离散模拟. 这或许是谱图理论中最重要的定理也是在算法应用中最有用的facts.它通过拉普拉斯矩阵的第二特征值来近似图的最小割
谱的定义 就是:
方阵作为线性算子,它的所有特征值的全体 统称方阵的谱;
方阵的谱半径为最大的特征值;
矩阵A的谱半径:的最大特征值。
其实,这里谱的本质是伪逆,是SVD中奇异值的平方
2. 谱聚类的基本思想
2.1 聚类与图论
所谓聚类(Clustering), 就是要把一堆样本合理地分成两份或者K份. 从图论的角度来说,聚类的问题就相当于一个图的分割问题. 即给定一个图G=(V,E), 顶点集V表示各个样本,带权的边表示各个样本之间的相似度,谱聚类的目的便是要找到一种合理的分割图的方法,使得分割后形成若干个 子图,连接不同 子图 的边的权重(相似度)尽可能低,同 子图内 的边的权重(相似度)尽可能高.被割掉各边的权值和越小代表被它们连接的子图之间的相似度越小,隔得越远. 物以类聚,人以群分,相似的在一块儿,不相似的彼此远离
至于如何把图的顶点集分割/切割为不相交的子图有多种办法,如
- cut/Ratio Cut
- Normalized Cut
- 不基于图,而是转换成SVD能解的问题
2.2 最小割
在将数据从点集的结构转换为了图的结构后,我们可以引入更多图论中的概念来帮助理解聚类的本质. 比如说最小割的概念(Minimum cut)
最小割是指去掉图中的一些带权边,在使得图从联通图变为不联通图的前提下,尽可能的让去掉的边权值之和尽可能小。对于数据的相似性图来说,最小割就是要去除一些很弱的相似性,把数据点从一个互相连接的整体分为两个或者多个独立的部分,这其实就是一个聚类的过程。去除的权值就是聚类后不同组别间的相似程度,我们希望这个值尽可能的小,也就是希望不同组别之间的差距尽可能的大
不过,仅仅是用最小割来聚类存在着一些缺陷,因为我们只考虑了不同类的点之间相似度要小,而一个好的聚类还要具有同一类点相似度大的特征。比如下图就是一个例子,一个好的聚类应该是在绿线处分割整个图,但使用最小割却会割在红色的位置
比如我们把中间的边去掉,就满足上面的簇间相似性最小,簇内相似性最大。如下图
3. 算法步骤
谱聚类算法主要有下面几部分:
3.1 未正则拉普拉斯矩阵 的谱聚类算法
3.1.1 计算得到图的邻接矩阵D ,以及拉普拉斯矩阵L ;
给定样本的原始特征,我们需要计算两两样本之间的相似度值,才能构造出邻接矩阵W . 我们一般使用高斯核函数来计算相似度。公式如下:
3.1.2 聚类划分准则
关于划分准则的问题是聚类技术中的核心。谱聚类被看作属于图论领域的问题,那个其划分也会和边的权重有关
准则1:最小化进行分割时去掉的边的权重之和
谱聚类Spectral Clustering
谱聚类已经成为最常用的现代聚类算法之一,相对于传统的聚类算法比如K-means,谱聚类的效果更出色,而且它实现简单,只需要标准的线性代数工具就可以有效的求解。
算法思路
谱聚类是一种基于降维的聚类算法,它由两部分组成,第一部分是对数据进行一定的变换,使得交织在一起的数据分开,第二部分是使用传统的K-means算法对变换后的数据聚类。下图中的数据单纯的使用K-means会得到非常差的结果,但是使用谱聚类可以实现非常好的聚类效果。
因此,谱聚类的关键在于找到一个好的变换,将K-means不能处理的数据变换为K-means可以处理的数据。
从直觉上我们知道,一个好的聚类应该具有两个特征
- 属于同一类的点之间相似性较大;
- 不属于同一类的点之间相似性较小;
所以我们要找到一个变换,使得相似性大的点能更接近,而相似度小的点会距离更远。首先要引入表示数据点之间相似度的临接矩阵。
数据的相似性图
数据本身可以看成一个个的点,如果我们给某些点之间加上一条无向带权边,那么数据的结构就是一个图G=(X,E)
,这里X表示图中的数据点的合集,E表示带权的边。
如果这里边带的权代表这两点之间的相似程度的话,那么这个图就叫做数据的相似性图(Similarity graph)。比如下图的左边是七个数据点,右边是带了权的相似性图。
。
数据的相似性图不是唯一的,可以用基于不同度量的不同方法来构建该图,最常见的构建方法是对第i个数据点,离该点最近的p个数据点使用它们之间的欧几里得距离作为相似性的度量,其他较远的点相似性程度都为0。一旦构建好了相似性图G,我们就可以写下用来描述这个图的临接矩阵W。
首先我们对每个数据点标个号,比如在这个图中从1到7来标记每个数据点。
临接矩阵W中元素Wij表示第i个点xi到第j个点xj的权值(相似程度),因为xi到xj的相似程度和xj到xi的相似程度是一样的,所以对任意i,j都有wij=wji,所以W是一个对称矩阵。
比如上图中的临接矩阵就是这样的:
还有一个常用的量叫次数矩阵(Degree Matrix),通常记为D,这是一个对角矩阵,第i个对角元di的值代表着所有和第i个点相连接的权值之和。
上例中的次数矩阵是这样的:
最小割
在将数据从点集的结构转换为了图的结构后,我们可以引入更多图论中的概念来帮助理解聚类的本质。比如说最小割的概念(Minimum cut)。
最小割是指去掉图中的一些带权边,在使得图从联通图变为不联通图的前提下,尽可能的让去掉的边权值之和尽可能小。对于数据的相似性图来说,最小割就是要去除一些很弱的相似性,把数据点从一个互相连接的整体分为两个或者多个独立的部分,这其实就是一个聚类的过程。去除的权值就是聚类后不同组别间的相似程度,我们希望这个值尽可能的小,也就是希望不同组别之间的差距尽可能的大。
下图一个最小割的例子,通过去掉权值为0.1和0.2的两条边,将数据点划分为了两个部分,也就是聚为了两类。
不过,仅仅是用最小割来聚类存在着一些缺陷,因为我们只考虑了不同类的点之间相似度要小,而一个好的聚类还要具有同一类点相似度大的特征。比如下图就是一个例子,一个好的聚类应该是在绿线处分割整个图,但使用最小割却会割在红色的位置。
为此Shi和Malik在1997年提出了规范化割(Normalized cut)的概念,将类内和类间的相似度都考虑进去,谱聚类就是通过最小化Normalized cut,使聚类的结果更加均衡。
Normalized Cut
首先说明一下使用的记号,X代表全部数据点,Xi代表第i个数据点;A.B分别代表X的两个互斥子集,同时它们也可以被看成数据点聚成的两类。我们记cut(A,B)为A和B两类间的类间相似度,assoc(A,X)为A和X间的相似度。
其实这里cut和assoc的定义是一样的,但是为了它们两个的含义不同,cut是用来衡量类间的相似性,assoc是用来衡量类内的相似性。
比如说对于下图来说,cut(A,B)=0.2+0.1=0.3;assoc(A,X)=0.8+0.7+0.7+0.9+0.2+0.1=3.4;assoc(B,X)=0.7+0.7+0.7+0.1+0.2=2.4。
Normalized cut被定义为
谱聚类的本质就是要找到能最小化Ncut(A,B)的A和B。
谱聚类的求解
要求解谱聚类,即要解出哪些数据点属于A,哪些数据点属于B,为了数学描述的方便,我们用一个n维向量c来表示谱聚类的解。ci∈-1,1,如果第i个数据点属于A,那么ci=−1,否则第i个点属于B,那么ci=1。
我们先将要最小化的目标Ncut(A,B)转化为和向量c有关的形式。
举例
在R语言中,kernlab包提供了specc函数帮助我们进行谱聚类。在这里我们示例如何对经典的Iris数据集使用谱聚类算法。
#R语言代码 ggplot2绘图
library(kernlab)
library(ggplot2)
data(iris)
data <- as.matrix(iris[,-5]) #将数据由data.frame转化为matrix的形式
model <- specc(data, 3)
iris$spectral <- as.factor(model)
fig <- ggplot(iris, aes(x=Sepal.Length,y=Sepal.Width)) + geom_point(aes(colour=spectral))
print(fig)
下面左图是标准的分类,右图是谱聚类的结果。
可见结果并不好,这是因为谱聚类是一种基于降维的局部聚类算法,这里使用Iris数据集只是为了举例,它最合适的应用场景是连续且交错在一起的数据集,比如下图的数据。
拓展阅读
谱聚类是一个很新的方法,想对它有更深入了解的建议阅读Ulrike von Luxburg写的A Tutorial on Spectral Clustering。