项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步
1.谱聚类概述
谱聚类(Spectral clustering)是利用矩阵的特征向量进行聚类的一种方法,其本质上是矩阵特征分解进行降维的一种方法。它一般由两部分组成,第一部分是对数据进行变换,第二部分再使用传统的kmeans等方法对变换以后的数据进行聚类。
谱聚类是从图论中演化出来的算法,后来在聚类中得到了广泛的应用。它的主要思想是把所有的数据看做空间中的点,这些点之间可以用边连接起来。距离较远的两个点之间的边权重值较低,而距离较近的两个点之间的边权重值较高,通过对所有数据点组成的图进行切图,让切图后不同的子图间边权重和尽可能的低,而子图内的边权重和尽可能的高,从而达到聚类的目的。(这一段内容来自刘建平老师的描述,具体见参考文献1)
2.谱聚类的基本步骤
在具体的内容展开之前,可以看一下谱聚类的基本步骤
1.先确定参数,包括一个描述相似性图的邻接矩阵W,与聚类的目标类书目k。
2.计算度(次数)矩阵D与拉普拉斯矩阵L。
3.计算标准化以后的拉普拉斯矩阵
D
−
1
/
2
L
D
1
/
2
D^{-1/2}LD^{1/2}
D−1/2LD1/2。
4.求
D
−
1
/
2
L
D
1
/
2
D^{-1/2}LD^{1/2}
D−1/2LD1/2最小k_1个特征值所对应的的特征向量
f
k
f_k
fk。
5.将上述的特征向量
f
k
f_k
fk构成的矩阵行标准化,得到
n
∗
k
n*k
n∗k矩阵。
6.对上述的n个样本用诸如kmeans等方法进行聚类,聚类维数为
k
2
k_2
k2。
7.得到簇的划分
C
(
c
1
,
c
2
,
⋯
,
c
k
2
)
C(c_1, c_2, \cdots, c_{k2})
C(c1,c2,⋯,ck2)
3.图的基本概念
图是数据结构中的概念。图是由顶点与边构成,任意两个节点之间可能都有边进行连接,如果边带有值的信息,称为权重。比如下面的一个图。
图一般用字母G表示,边一般用E表示,点用V表示。如果两个点之间有连接,则有一条边。如果边是单向的,则边是有向的,该图为有向图。否则为无向图。
顶点的度定义为该顶点所关联的边的数量,对于有向图它还分为出度和入度,出度是指从一个顶点射出的边的数量,入度是连入一个节点的边的数量。无向图可以用三元组形式化的表示:
(
V
,
E
,
ω
)
(V, E, \omega)
(V,E,ω)
其中,V是顶点集合,E是边的集合, ω \omega ω是边的权重。假设i和j为图的顶点, W i j W_{ij} Wij为边(i,j)的权重,由它构成的矩阵W称为邻接矩阵。那么对于无向图来说,其邻接矩阵为对称矩阵。
对于图中的任意一个点
v
i
v_i
vi,定义他的度
d
i
d_i
di为和他连接的所有边的权重之和
d
i
=
∑
j
=
1
n
w
i
j
d_i = \sum \limits_{j=1}^{n}w_{ij}
di=j=1∑nwij
利用每个点度的定义,可以得到一个n*n的度矩阵D,其为对角矩阵,只有局对角线有值,对应第i个点的度。
$$
D
=
[
d
1
⋯
⋯
⋯
d
2
⋯
⋯
⋯
⋯
⋯
⋯
d
n
]
(3)
D = \left[ \begin{matrix} d_1 & \cdots & \cdots \\ \cdots & d_2 & \cdots \\ \cdots & \cdots & \cdots \\ \cdots & \cdots & d_n \\ \end{matrix} \right] \tag{3}
D=⎣⎢⎢⎡d1⋯⋯⋯⋯d2⋯⋯⋯⋯⋯dn⎦⎥⎥⎤(3)$$
4.相似矩阵与拉普拉斯矩阵
上面提到了邻接矩阵,那么怎样得到邻接矩阵?常见的构建方法是对第i个数据点,离该点最近的p个数据点使用它们之间的欧几里得距离作为相似性的度量,其他较远的点相似性程度都为0。一旦构建好了相似性图G,我们就可以写下用来描述这个图的临接矩阵W。
一般由三种方式构建邻接矩阵,
ϵ
\epsilon
ϵ邻近,K邻近与全链接。
ϵ
\epsilon
ϵ邻近是设置一个阈值
ϵ
\epsilon
ϵ,然后计算任意两点ij之间的距离
s
i
j
=
∣
∣
x
i
−
x
j
∣
∣
2
2
s_{}ij = || x_i - x_j || _2 ^ 2
sij=∣∣xi−xj∣∣22 。
P
(
x
∣
P
a
x
)
=
{
0
,
s
i
j
>
ϵ
ϵ
,
s
i
j
≤
ϵ
P(x|Pa_x)=\begin{cases} 0, & s_{ij} > \epsilon\\ \epsilon, & s_{ij} \leq \epsilon \end{cases}
P(x∣Pax)={0,ϵ,sij>ϵsij≤ϵ
第二种方式是K邻近法,找到每个样本最近的k个点作为近邻,只有和样本距离最近的k个点之间的
ω
i
j
>
0
\omega_{ij} > 0
ωij>0
全连接法相比较前两种,所有的点之间的权重值都大于0,因此称之为全连接法。可以选择不同的核函数来定义边权重,常用的有多项式核函数,高斯核函数和Sigmoid核函数。最常用的是高斯核函数RBF,此时相似矩阵和邻接矩阵相同:
w
i
j
=
s
i
j
=
e
x
p
(
−
∣
∣
x
i
−
x
j
∣
∣
2
2
2
σ
2
)
w_{ij} = s_{ij} = exp(- \frac{||x_i - x_j||_2^2}{2\sigma ^ 2})
wij=sij=exp(−2σ2∣∣xi−xj∣∣22)
其中,
σ
\sigma
σ控制邻域的宽度,是人工设置的超参数。
然后我们可以定义拉普拉斯矩阵L = D - W,其中D为上面讲到的度矩阵,是一个对角矩阵。W为邻接矩阵,可以由上面提到的方法构造出来。因为D是对角矩阵,而W为对称矩阵,很明显L也为对称矩阵。
5.图的切割
对于无向图G,我们的目标是将G(V, E)切成相互没有连接的k个子图,每个子图点的集合为:
A
1
,
A
2
,
⋯
,
A
k
A_1, A_2, \cdots, A_k
A1,A2,⋯,Ak。
对于任意两个子图点的集合A, B,定义AB之间的切图权重为
W
(
A
,
B
)
=
∑
i
∈
A
,
j
∈
B
w
i
j
W(A, B) = \sum \limits _{i \in A, j \in B} w_{ij}
W(A,B)=i∈A,j∈B∑wij
那么对于k个子图的集合
A
1
,
A
2
,
⋯
,
A
k
A_1, A_2, \cdots, A_k
A1,A2,⋯,Ak,定义图的cut
c
u
t
(
A
1
,
A
2
,
⋯
,
A
k
)
=
1
2
∑
i
=
1
k
W
(
A
i
,
A
i
‾
)
cut(A_1, A_2, \cdots, A_k) = \frac{1}{2}\sum \limits _{i=1}^k W(A_i, \overline {A_i})
cut(A1,A2,⋯,Ak)=21i=1∑kW(Ai,Ai)
那么切图的要求自然就是高内聚,低耦合了,就是说每个子图内的点权重高,而每个子图之间的点权重和低。一个自然的想法就是最小化
c
u
t
(
A
1
,
A
2
,
⋯
,
A
k
)
cut(A_1, A_2, \cdots, A_k)
cut(A1,A2,⋯,Ak),但是这样会存在问题。
上图可以看出smallest cut跟best cut差别很大。
6.不同的切图方式
6.1 RatioCut
为了避免上面的最小切图,除了考虑 c u t ( A 1 , A 2 , ⋯ , A k ) cut(A_1, A_2, \cdots, A_k) cut(A1,A2,⋯,Ak),我们还考虑最大化每个子图点的个数,即
R a t i o c u t ( A 1 , A 2 , ⋯ , A k ) = 1 2 ∑ i = 1 k W ( A i , A i ‾ ) ∣ A i ∣ Ratiocut(A_1, A_2, \cdots, A_k) = \frac{1}{2} \sum \limits _{i=1}^k \frac{W(A_i, \overline {A_i})}{|A_i|} Ratiocut(A1,A2,⋯,Ak)=21i=1∑k∣Ai∣W(Ai,Ai)
6.2 Ncut
Ncut与RatioCut不一样的地方在于,将分母
∣
A
i
∣
|A_i|
∣Ai∣换成了
v
o
l
(
A
i
)
vol(A_i)
vol(Ai)。其中,我们将
v
o
l
(
A
i
)
vol(A_i)
vol(Ai)定义为:
v
o
l
(
A
i
)
=
∑
i
∈
A
d
i
vol(A_i) = \sum \limits _{i \in A} d_i
vol(Ai)=i∈A∑di
7.谱聚类的优缺点
优点:
1.算法过程中只用到数据点之间的相似矩阵,所以处理稀疏数据毫无压力。
2.因为在矩阵分解的过程中,会有降维,因此处理高维数据的时候复杂度比kmeans等算法低。
缺点:
1.最终的效果依赖相似矩阵,不同的相似矩阵结果差别比较大。
2.如果聚类的维度很高,可能因为降维幅度不够,谱聚类的运行速度和最后的聚类效果均不好。
8.总结
综上所述,谱聚类是一种基于图的算法。先把样本数据看成图的顶点,根据数据点之间的距离构造边,形成带权重的图,然后通过对图进行处理来完成算法所需的功能。对于聚类问题,通过图的切割实现聚类,即将图切分成多个子图,这些子图就是对应的簇。
参考文献
1.https://www.cnblogs.com/pinard/p/6221564.html