【机器学习】谱聚类看这一篇就够了
\quad\quad 在了解谱聚类之前,我们先了解聚类是什么。
一、聚类
\quad\quad 聚类是一种无监督学习技术,它旨在将数据集中的样本划分成若干个组别或“簇”,使得同一个簇内的样本相似度较高,而不同簇之间的样本相似度较低。聚类分析在许多领域都有应用,包括机器学习、数据挖掘、统计学、生物学和社会科学等。
1、聚类的主要目标
(1)数据压缩:通过将数据划分为簇,可以简化数据结构,便于理解和分析。
(2)模式发现:识别数据中的潜在模式或结构,这些模式可能与数据生成过程有关。
(3)异常检测:聚类可以揭示数据中的异常点或离群点。
(4)探索性数据分析:在没有明确假设的情况下,探索数据的内在结构。
2、聚类算法的分类
\quad\quad 聚类算法可以根据它们的特性和操作方式被分为不同的类型:
(1)基于划分的聚类:如K-means和K-medoids算法,它们试图找到数据空间中的最佳划分,使得簇内的点尽可能相似,簇间的点尽可能不同。
(2)层次聚类:如AGNES算法,通过创建一个簇的层次结构来组织数据,可以用于生成树状的聚类结构(即聚类树或谱系树)。
(3)基于密度的聚类:如DBSCAN算法,根据数据空间中的密度分布将样本划分为簇,能够识别任意形状的簇。
(4)基于网格的聚类:如STING和CLIQUE算法,将数据空间划分为有限数量的单元格,形成一个网格结构,并在这个网格结构上进行聚类。
(5)基于模型的聚类:如高斯混合模型(GMM),假设数据是由若干概率分布生成的,通过估计这些分布的参数来进行聚类。
(6)图聚类:如Kernighan–Lin算法、Label Propagation算法、谱聚类等,是一种将图数据进行分组或聚类的技术。其中,谱聚类利用数据的图结构信息,通过分析图的谱特性来进行聚类。
3、聚类评估
\quad\quad 聚类结果的质量通常通过以下指标进行评估:
(1)内部一致性:同一个簇内的样本应该尽可能相似。
(2)分离性:不同簇之间的样本应该尽可能不同。
(3)稳定性:聚类结果对于数据的小扰动应该是稳定的。
(4)密度保持:簇的形状和密度应该与原始数据保持一致。
4、聚类的应用场景
(1)市场细分:根据消费者行为将市场划分为不同的细分市场。
(2)社交网络分析:在社交网络中发现社区结构。
(3)图像分割:将图像分割成不同的区域以便于进一步分析。
(4)基因表达分析:在生物信息学中,根据基因表达模式将基因分组。
5、谱聚类介绍
\quad\quad 谱聚类是一种基于图的谱结构进行聚类的方法。它利用图的谱结构进行聚类。具体来说,谱聚类首先将图表示为一个拉普拉斯矩阵,然后通过对拉普拉斯矩阵的特征向量进行聚类来得到最终的结果。
(1)技术背景和动机:
\quad\quad 在数据科学和机器学习领域,聚类是一项重要的任务,旨在将数据点分组成具有相似特征的集合。然而,传统的聚类算法,如K-means,通常假设簇是凸的、等方差的,且簇与簇之间是分离的。这些假设在现实世界数据中往往不成立,导致传统算法在处理复杂形状和高维数据时效果不佳。为解决这些问题,谱聚类应运而生。
\quad\quad 谱聚类的动机在于,它通过考虑数据点之间的相似度来进行聚类,而不仅仅是点与点之间的距离。这种方法使得谱聚类对数据的非线性结构和复杂形状具有更好的适应性,因此可用于处理非球形簇、降维、多维缩放等问题,在处理在图像分割、社交网络分析、生物信息学等领域得到广泛应用。
(2)优点
I. 谱聚类对图的拓扑结构进行了有效的利用,使得它对数据的非线性结 构和复杂形状具有较好的适应性,并且在理论上具有较好的收敛性和稳定性,并且在一定条件下具有较好的理论性能保证。
II. 谱聚类只需要数据之间的相似度矩阵,因此对于处理稀疏数据的聚类很有效。这点传统聚类算法比如K-Means很难做到。
III. 由于使用了降维,因此在处理高维数据聚类时的复杂度比传统聚类算法好。
\quad\quad 一言以蔽之,聚类算法能够处理传统聚类算法难以解决的复杂数据结构,同时是一种降维和聚类相结合的有效手段。
(3)缺点
I. 如果最终聚类的维度非常高,则由于降维的幅度不够,谱聚类的运行速度和最后的聚类效果均不好。
II. 聚类效果依赖于相似矩阵,不同的相似矩阵得到的最终聚类效果可能很不同。
谱聚类是一种基于图的谱结构进行聚类的方法。它利用图的谱结构进行聚类。要理解谱聚类,必须要先理解一些必要的图论知识。
二、图论
1、无向权重图
\quad\quad 对于一个图 G,一般用点的集合 V 和边的集合E 来描述。即为 G ( V , E ) 。其中V 即为我们数据集里面所有的点 V = ( v 1 , v 2 , . . . , v n ) V=(v_1,v_2,...,v_n) V=(v1,v2,...,vn)。对于 V 中的任意两个点,可以有边连接,也可以没有边连接。我们定义权重 w i j w_{ij} wij 为点 v i v_i vi 和点 v j v_j vj 之间的权重。由于我们是无向图,所以 W i j = W j i W_{ij}=W_{ji} Wij=Wji
2、邻接矩阵
\quad\quad 对于有边连接的两个点 v i v_i vi 和点 v j v_j vj , $ w_{ij} > 0 $ ,对于有边连接的两个点 v i v_i vi 和点 v j v_j vj , $ w_{ij} > 0 $ 。
\quad\quad 如果我们认为连接的节点的权值是1 ,没有连接的节点的权值为0 ,则此时我们可以得到一个权值矩阵 ,该矩阵即为图的邻接矩阵 。
\quad\quad 定义顶点的度为该顶点与其他顶点连接权值之和:
d i = ∑ j = 1 N w i j d_i=\sum_{j=1}^{N}{w_{ij}} di=j=1∑Nwij
\quad\quad
利用每个点度的定义,我们可以得到一个 n x n 的度矩阵D,它是一个对角矩阵,只有主对角线有值,对应第i行的第i个点的度数,定义如下:
a
=
(
d
1
.
.
.
.
.
.
0
0
d
2
.
.
.
⋮
⋮
.
.
.
⋱
⋮
0
.
.
.
0
d
n
)
(3)
a=\begin{pmatrix} d_1 & ... & ...& 0 \\ 0 & d_2 & ... & \vdots \\ \vdots & ... & \ddots &\vdots \\ 0 & ... & 0 & d_n \end{pmatrix} \tag{3}
a=
d10⋮0...d2............⋱00⋮⋮dn
(3)
3、相似矩阵
\quad\quad 邻接矩阵由任意两点之间的权重 w i j w_{ij} wij 组成的矩阵。在谱聚类中,我们只有数据点的定义,并没有直接给出这个邻接矩阵,那么怎么得到这个邻接矩阵呢?
\quad\quad 基本思想是:距离较远的两个点之间的边权重值较低,而距离较近的两个点之间的边权重值较高,不过这仅仅是定性,我们需要定量的权重值。一般来说,我们可以通过样本点距离度量的相似矩阵S来获得邻接矩阵 W 。
\quad\quad 构建邻接矩阵W的方法有三类。 ϵ \epsilon ϵ-邻近法,K邻近法和全连接法。
(1) ϵ \epsilon ϵ-邻近法
\quad\quad
ϵ
\epsilon
ϵ-邻近法它设置了一个距离阈值ϵ, 然后用欧氏距离
s
i
j
s_{ij}
sij督练内功任意两点
x
i
x_i
xi和
x
j
x_{j}
xj的距离。即相似距离
s
i
j
=
∥
x
i
−
x
j
∥
2
2
s_{ij}=\Vert x_i-x_j \Vert _2^2
sij=∥xi−xj∥22,然后根据$s_{ij}
1
和
1和
1和 \epsilon $ 的大小关系,来定义邻接矩阵W 如下:
w
i
j
=
{
0
i
f
s
i
j
≥
ϵ
ϵ
i
f
s
i
j
≤
ϵ
w_{ij}= \begin{cases} 0 \quad\quad\quad if \quad s_{ij} \geq \epsilon\\ \epsilon \quad\quad\quad if\quad s_{ij} \leq \epsilon \end{cases}
wij={0ifsij≥ϵϵifsij≤ϵ
\quad\quad
ϵ
\epsilon
ϵ-邻近法两点的权重不是$ \epsilon$ ,就是0。因此距离远近度量很不精确,在实际应用中,我们很少使用
ϵ
\epsilon
ϵ邻近法。
(2)K邻近法
\quad\quad 利用KNN算法遍历所有的样本点,取每个样本最近的K个点作为近邻,只有和样本距离最近的K个点之间的 w i j w_{ij} wij >0 。只有和样本距离最近的K个点之间的 w i j w_{ij} wij > 0。但是这种方法会造成重构之后的邻接矩阵W非对称,我们后面的算法需要对称邻接矩阵。为了解决这种问题,一般采取下面两种方法之一:
(a)只要一个点在另一个点的K 近邻中,则保留
s
i
j
s_{ij}
sij
w
i
j
=
w
j
i
=
{
0
i
f
x
i
∉
K
N
N
(
x
j
)
≥
ϵ
ϵ
i
f
s
i
j
≤
ϵ
w_{ij}=w_{ji}= \begin{cases} 0 \quad\quad\quad if \quad x_i\notin KNN(x_j)\quad \geq \epsilon\\ \epsilon \quad\quad\quad if\quad s_{ij} \leq \epsilon \end{cases}
wij=wji={0ifxi∈/KNN(xj)≥ϵϵifsij≤ϵ
(b) 第二种K 邻近法是必须两个点互为K 近邻中,才能保留 sij
w
i
j
=
w
j
i
=
{
0
i
f
x
i
∉
K
N
N
(
x
j
)
≥
ϵ
ϵ
i
f
s
i
j
≤
ϵ
全连接法
w_{ij}=w_{ji}= \begin{cases} 0 \quad\quad\quad if \quad x_i\notin KNN(x_j)\quad \geq \epsilon\\ \epsilon \quad\quad\quad if\quad s_{ij} \leq \epsilon \end{cases} 全连接法
wij=wji={0ifxi∈/KNN(xj)≥ϵϵifsij≤ϵ全连接法
(3)全连接法
\quad\quad 相比前两种方法,第三种方法所有的点之间的权重值都大于0,因此称之为全连接法。
\quad\quad 可以选择不同的核函数来定义边权重,常用的有多项式核函数,高斯核函数和Sigmoid核函数。最常用的是高斯核函数RBF,此时相似矩阵和邻接矩阵相同
4、拉普拉斯矩阵
\quad\quad
拉普拉斯矩阵(Laplacian matrix)),也称为基尔霍夫矩阵, 是表示图的一种矩阵。给定一个有n个顶点的图,其拉普拉斯矩阵被定义为:
L
=
D
−
W
L=D-W
L=D−W
\quad\quad
其中D为图的度矩阵,W为图的邻接矩阵。
\quad\quad
举个例子,给定一个简单的图,如下:
\quad\quad
把此“图”转换为邻接矩阵的形式,记为:W
(
0
1
0
0
1
0
1
0
1
0
1
0
0
1
0
1
0
0
0
0
1
0
1
1
1
1
0
1
0
0
0
0
0
1
0
0
)
\left (\begin {array}{} 0 & 1 & 0 & 0 & 1 & 0 \\ 1 & 0 & 1 & 0 & 1 & 0 \\ 0 & 1 & 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 & 1 & 1 \\ 1 & 1 & 0 & 1 & 0 & 0 \\ 0 & 0 & 0 & 1 & 0 & 0 \\ \end{array} \right)
010010101010010100001011110100000100
\quad\quad
把的每一列元素加起来得到个数,然后把它们放在对角线上(其它地方都是零),组成一个N×N对角矩阵,记为度矩阵D,如下所示:
(
2
0
0
0
0
0
0
3
0
0
0
0
0
0
2
0
0
0
0
0
0
3
0
0
0
0
0
0
3
0
0
0
0
0
0
1
)
\left( \begin{array}{} 2 & 0 & 0 & 0 & 0 & 0 \\ 0 & 3 & 0 & 0 & 0 & 0 \\ 0 & 0 & 2 & 0 & 0 & 0 \\ 0 & 0 & 0 & 3 & 0 & 0 \\ 0 & 0 & 0 & 0 & 3 & 0 \\ 0 & 0 & 0 & 0 & 0 & 1 \\ \end{array} \right)
200000030000002000000300000030000001
\quad\quad
把的每一列元素加起来得到个数,然后把它们放在对角线上(其它地方都是零),组成一个N×N对角矩阵,记为度矩阵D ,如下所示:
(
2
0
0
0
0
0
0
3
0
0
0
0
0
0
2
0
0
0
0
0
0
3
0
0
0
0
0
0
3
0
0
0
0
0
0
1
)
\left( \begin{array}{} 2 & 0 & 0 & 0 & 0 & 0 \\ 0 & 3 & 0 & 0 & 0 & 0 \\ 0 & 0 & 2 & 0 & 0 & 0 \\ 0 & 0 & 0 & 3 & 0 & 0 \\ 0 & 0 & 0 & 0 & 3 & 0 \\ 0 & 0 & 0 & 0 & 0 & 1 \\ \end{array} \right)
200000030000002000000300000030000001
\quad\quad
根据拉普拉斯矩阵的定义L=D−W,可得拉普拉斯矩阵 L为:
(
2
−
1
0
0
−
1
0
−
1
3
−
1
0
−
1
0
0
−
1
2
−
1
0
0
0
0
−
1
3
−
1
−
1
−
1
−
1
0
−
1
3
0
0
0
0
−
1
0
1
)
\left( {\begin{array}{} 2 & { - 1} & 0 & 0 & { - 1} & 0 \\ { - 1} & 3 & { - 1} & 0 & { - 1} & 0 \\ 0 & { - 1} & 2 & { - 1} & 0 & 0 \\ 0 & 0 & { - 1} & 3 & { - 1} & { - 1} \\ { - 1} & { - 1} & 0 & { - 1} & 3 & 0 \\ 0 & 0 & 0 & { - 1} & 0 & 1 \\ \end{array}} \right)
2−100−10−13−10−100−12−10000−13−1−1−1−10−130000−101
【拉普拉斯矩阵L的性质】
(1)拉普拉斯矩阵是对称半正定矩阵,这可以由 D 和W 都是对称矩阵而得;
(2)L 的最小特征值是 0,相应的特征向量是 1 。
\quad\quad 证明:$ L* 1 = (D -W ) * 1 = 0 = 0 * 1$。
\quad\quad
(特征值和特征向量的定义:若数字
λ
\lambda
λ 和非零向量 $\vec {v} $ 满足
v
⃗
=
λ
v
⃗
\vec{v}=\lambda \vec{v}
v=λv ,则$ \lambda$ 为的A 一个特征向量,$ \vec {v} $ 是其对应的特征值)。
(3)L 有n个非负实特征值,且
0
=
λ
1
⩽
λ
2
⩽
.
.
.
⩽
λ
n
0=\lambda _{1} \leqslant \lambda _{2} \leqslant ... \leqslant \lambda _{n}
0=λ1⩽λ2⩽...⩽λn
(4)且对于任何一个属于实向量
f
∈
R
n
f \in \mathbb{R}^{n}
f∈Rn ,有以下式子成立:
f
T
L
f
=
1
2
∑
i
,
j
=
1
n
w
i
j
(
f
i
−
f
j
)
2
f^{T}Lf=\frac1 2 \sum_{i,j=1}nw_{ij}(f_i-f_j)^2
fTLf=21i,j=1∑nwij(fi−fj)2
5、无向图切图:
(1) 子图与子图的连接权重
\quad\quad
对于无向图G 的切图,我们的目标是将图G ( V , E ) 切成相互没有连接的k 个子图,每个子图点的集合为:
A
1
,
A
2
,
.
.
.
,
A
k
,其中
A
i
∩
A
j
=
∅
,
且
A
1
∪
A
2
∪
.
.
.
∪
A
k
=
V
{\rm{A}}_1 ,{\rm{A}}_2 ,...,{\rm{A}}_k,其中{\rm{A}}_i \cap {\rm{A}}_j = \emptyset, \quad 且 \quad {\rm{A}}_1 \cup {\rm{A}}_2 \cup ... \cup {\rm{A}}_k = {\rm{V}}
A1,A2,...,Ak,其中Ai∩Aj=∅,且A1∪A2∪...∪Ak=V
, 其中$ {\rm{A}}_i \cap {\rm{A}}_j = \emptyset , 且 , 且 ,且 {\rm{A}}_1 \cup {\rm{A}}_2 \cup … \cup {\rm{A}}_k = {\rm{V}} $
\quad\quad 我们可以将下面的图划分成两个子图,如下图所示:
\quad\quad
定义 A和 B 是图 G 中两个子图,则定义子图A 和 B 的切图权重为:
W
(
A
,
B
)
=
∑
i
∈
A
,
j
∈
B
w
i
j
\mathbf{W(A,B)}=\sum_{i\in A,j\in B}w_{ij}
W(A,B)=i∈A,j∈B∑wij
\quad\quad
那么对于我们k 个子图的集合: , 我们定义切图 cut 为:
c
u
t
(
A
1
,
A
2
,
.
.
.
,
A
k
)
=
1
2
∑
i
=
1
k
W
(
A
i
,
A
‾
i
)
cut(\mathbf {A_{1}, A_{2},..., A_{k} })=\frac1 2 \sum_{i=1}^k \mathbf{W}(A_i,\overline A_i )
cut(A1,A2,...,Ak)=21i=1∑kW(Ai,Ai)
\quad\quad
其中,
A
‾
i
\overline A_i
Ai 为
A
i
A_i
Ai 的补集。
(2)切图的目标函数
\quad\quad 那么如何切图可以让子图内的点权重和高,子图间的点权重和低呢?,显然是令 c u t ( A 1 , A 2 , . . . , A k ) cut(\mathbf {A_{1}, A_{2},..., A_{k} }) cut(A1,A2,...,Ak) 最小化,但这种最小化存在问题,如下图:
\quad\quad 我们选择一个权重最小的边缘的点,比如C 和H 之间进行cut,这样可以最小化 c u t ( A 1 , A 2 , . . . , A k ) cut(\mathbf {A_{1}, A_{2},..., A_{k} }) cut(A1,A2,...,Ak),但是却不是最优的切图,如何避免这种切图,并且找到类似图中"最好的切图方式"这样的最优切图呢?接下来就来看看谱聚类使用的切图方法。
三、谱聚类切图
\quad\quad 为了避免最小切图导致的切图效果不佳,我们需要对每个子图的规模做出限定,一般来说,有两种切图方式,第一种是 RatioCut ,第二种是 Ncut 。下面我们分别加以介绍。
1、RatioCut切图
\quad\quad
RatioCut切图为了避免上面出现的最小切图,对每个切图,不光考虑最小化$ \mathbf {cut(A_{1}, A_{2},…, A_{k} ) }$ ,它还同时考虑最大化每个子图点的个数,即:
R
a
t
i
o
c
C
u
t
(
A
1
,
A
2
,
.
.
.
,
A
k
)
=
1
2
∑
i
=
1
k
W
(
A
i
,
A
‾
i
)
∣
A
‾
i
∣
RatiocCut({\rm{A}}_1 {\rm{,A}}_2 ,...,{\rm{A}}_k ) = \frac{1}{2}\sum\limits_{i = 1}^k {\frac{{W(A_i ,\overline A _i )}}{{\left| {\overline A _i } \right|}}}
RatiocCut(A1,A2,...,Ak)=21i=1∑k
Ai
W(Ai,Ai)
\quad\quad 那么怎么最小化这个RatioCut函数呢?RatioCut函数可以通过如下方式表示:
\quad\quad 我们引入指示向量 h j = h 1 , h 2 , . . . . , h k j = 1 , 2 , . . . , k h_{j}={h_{1}, h_{2}, .... , h_{k}} \quad j = 1,2,..., k hj=h1,h2,....,hkj=1,2,...,k.
\quad\quad 对于任意一个向量 h j h_{j} hj,它是一个n维向量,我们定义$ h_{ij}$ 为:
h j i = { 0 , v i ∉ A j 1 ∣ A j ∣ , v i ∈ A j h_{ji} = \left\{ \begin{array}{l} 0,v_i \notin A_j \\ \frac{1}{{\sqrt {\left| {A_j } \right|} }},v_i \in A_j \\ \end{array} \right. hji={0,vi∈/Aj∣Aj∣1,vi∈Aj
\quad\quad
那么我们对于
h
i
T
L
h
i
h_{i}^{T}Lh_{i}
hiTLhi 有:
h
i
T
L
h
i
=
1
2
∑
m
=
1
∑
n
=
1
w
m
n
(
h
i
m
−
h
i
n
)
2
=
1
2
(
∑
m
∈
A
i
,
n
∉
A
i
w
m
n
(
1
∣
A
i
∣
−
0
)
2
+
∑
m
∉
A
i
,
n
∈
A
i
w
m
n
(
0
−
1
∣
A
i
∣
)
2
)
=
1
2
(
∑
m
∈
A
i
,
n
∉
A
i
w
m
n
1
∣
A
i
∣
+
∑
m
∈
A
i
,
n
∉
A
i
w
m
n
1
∣
A
i
∣
)
=
1
2
(
c
u
t
(
A
i
,
A
‾
i
)
1
∣
A
‾
i
∣
+
c
u
t
(
A
i
,
A
‾
i
)
1
∣
A
‾
i
∣
)
=
c
u
t
(
A
i
,
A
‾
i
)
∣
A
‾
i
∣
=
R
a
t
i
o
C
u
t
(
A
i
,
A
‾
i
)
\begin{array}{l} h_i^T Lh_i = \frac{1}{2}\sum\limits_{m = 1} {\sum\limits_{n = 1} {w_{mn} (h_{im} - h_{in} )^2 } } \\ \qquad = \frac{1}{2}(\sum\limits_{m \in A_i ,n \notin A_i } {w_{mn} } (\frac{1}{{\sqrt {\left| {A_i } \right|} }} - 0)^2 + \sum\limits_{m \notin A_i ,n \in A_i } {w_{mn} } (0 - \frac{1}{{\sqrt {\left| {A_i } \right|} }})^2 ) \\ \qquad = \frac{1}{2}(\sum\limits_{m \in A_i ,n \notin A_i } {w_{mn} } \frac{1}{{\left| {A_i } \right|}} + \sum\limits_{m \in A_i ,n \notin A_i } {w_{mn} } \frac{1}{{\left| {A_i } \right|}}) \\ \qquad = \frac{1}{2}(cut(A_i ,\overline A _i )\frac{1}{{\left| {\overline A _i } \right|}} + cut(A_i ,\overline A _i )\frac{1}{{\left| {\overline A _i } \right|}}) \\ \qquad= \frac{{cut(A_i ,\overline A _i )}}{{\left| {\overline A _i } \right|}} \\ \qquad = {\rm{RatioCut}}(A_i ,\overline A _i ) \\ \end{array}
hiTLhi=21m=1∑n=1∑wmn(him−hin)2=21(m∈Ai,n∈/Ai∑wmn(∣Ai∣1−0)2+m∈/Ai,n∈Ai∑wmn(0−∣Ai∣1)2)=21(m∈Ai,n∈/Ai∑wmn∣Ai∣1+m∈Ai,n∈/Ai∑wmn∣Ai∣1)=21(cut(Ai,Ai)∣Ai∣1+cut(Ai,Ai)∣Ai∣1)=∣Ai∣cut(Ai,Ai)=RatioCut(Ai,Ai)
\quad\quad
上述式子列出来的是对于某一个子图i ,它的RatioCut对应于$ h_{i}^{T}Lh_{i}$, 那么对于k个子图,对应的RatioCut函数表达式为:
R
a
t
i
o
c
C
u
t
(
A
1
,
A
2
,
.
.
.
,
A
k
)
=
∑
i
=
1
k
h
i
T
L
h
i
=
∑
i
=
1
k
(
H
T
L
H
)
i
i
=
t
r
(
H
T
L
H
)
RatiocCut({\rm{A}}_1 {\rm{,A}}_2 ,...,{\rm{A}}_k ) = \sum\limits_{i = 1}^k {h_i^T Lh_i = } \sum\limits_{i = 1}^k {(H^T LH)_{ii} = } tr(H^T LH)
RatiocCut(A1,A2,...,Ak)=i=1∑khiTLhi=i=1∑k(HTLH)ii=tr(HTLH)
\quad\quad 其中 t r ( H T L H ) tr(H^{T}LH) tr(HTLH) 为矩阵的迹。也就是说,我们的RatioCut切图,实际上就是最小化我们的, t r ( H T L H ) tr(H^{T}LH) tr(HTLH) 其中 ,$ H^{T}H=I$ ,则我们的切图优化目标为:
arg min t r ( H T L H ) s t . t . H T H = I \arg \min \ \ tr(H^T LH)\qquad st.t.H^T H = I argmin tr(HTLH)st.t.HTH=I
\quad\quad
注意到 H 矩阵里面的每一个指示向量都是n维的,向量中每个变量的取值为0或者$ \frac {1} {\sqrt {|A_{i}|}} $ ,就有
2
n
2
2^{n}2
2n2 种取值,有k个子图的话就有k个指示向量,共有$ k2^{n}$ 种 H ,因此找到满足上面优化目标的H 是一个NP难的问题。那么是不是就没有办法了呢?
\quad\quad
注意观察$tr(H^{T}LH) $ 中每一个优化子目标 $ h_{i}^{T}Lh_{i}$ ,其中h 是单位正交基,L 是对称矩阵,此时 $ h_{i}^{T}Lh_{i}$ 的最大值为L 的最大特征值,最小值是L 的最小特征值。
\quad\quad
如果你对主成分分析PCA熟悉的话,这里很好理解。在PCA中,我们的目标是找到协方差矩阵(对应此处的拉普拉斯矩阵L)的最大的特征值,而在我们的谱聚类中,我们的目标是找到目标的最小的特征值,得到对应的特征向量,此时对应二分切图效果最佳。也就是说,我们这里要用到维度规约的思想来近似去解决这个NP难的问题。
\quad\quad
通过找到L的最小的k个特征值,可以得到对应的k个特征向量,这k个特征向量组成一个nxk维度的矩阵,即为我们的H。一般需要对H里的每一个特征向量做标准化,即
h
i
=
h
i
∣
h
i
∣
h_i = \frac{{h_i }}{{\left| {h_i } \right|}}
hi=∣hi∣hi
\quad\quad
由于我们在使用维度规约的时候损失了少量信息,导致得到的优化后的指示向量h对应的H现在不能完全指示各样本的归属,因此一般在得到 n × k n\times kn×k 维度的矩阵H后还需要对每一行进行一次传统的聚类,比如使用K-Means聚类.
2、Ncut切图
\quad\quad
Ncut切图和RatioCut切图很类似,但是把Ratiocut的分母
∣
A
i
∣
|A_{i}|
∣Ai∣ 换成
v
o
l
(
A
i
)
vol(A_{i})
vol(Ai) 。由于子图样本的个数多并不一定权重就大,我们切图时基于权重也更合我们的目标,因此一般来说Ncut切图优于RatioCut切图。
N
C
u
t
(
A
1
,
A
2
,
.
.
.
,
A
k
)
=
1
2
∑
i
=
1
k
W
(
A
i
,
A
‾
i
)
v
o
l
(
A
i
)
NCut({\rm{A}}_1 {\rm{,A}}_2 ,...,{\rm{A}}_k ) = \frac{1}{2}\sum\limits_{i = 1}^k {\frac{{W(A_i ,\overline A _i )}}{{vol(A_i )}}}
NCut(A1,A2,...,Ak)=21i=1∑kvol(Ai)W(Ai,Ai)
\quad\quad
对应的NCut切图对指示向量
h
i
j
h_{ij}
hij 做了改进,注意到RatioCut切图的指示向量使用的是$ \frac {1}{\sqrt {|A_{j}|}} $ 标示样本归属,而Ncut切图使用了子图权重 $ \frac {1}{\sqrt {vol(A_{j}|)}}
$ 来标示指示向量h,定义如下:
h
j
i
=
{
0
,
v
i
∉
A
j
1
v
o
l
(
A
j
)
,
v
i
∈
A
j
h_{ji} = \left\{ \begin{array}{l} 0,v_i \notin A_j \\ \frac{1}{{\sqrt {vol(A_j )} }},v_i \in A_j \\ \end{array} \right.
hji={0,vi∈/Ajvol(Aj)1,vi∈Aj
\quad\quad
那么我们对于$ h_{i}^{T}Lh_{i}$ 有:
h
i
T
L
h
i
=
1
2
∑
m
=
1
∑
n
=
1
w
m
n
(
h
i
m
−
h
i
n
)
2
=
1
2
(
∑
m
∈
A
i
,
n
∉
A
i
w
m
n
(
1
v
o
l
(
A
i
)
−
0
)
2
+
∑
m
∉
A
i
,
n
∈
A
i
w
m
n
(
0
−
1
v
o
l
(
A
i
)
)
2
)
=
1
2
(
∑
m
∈
A
i
,
n
∉
A
i
w
m
n
1
v
o
l
(
A
i
)
+
∑
m
∈
A
i
,
n
∉
A
i
w
m
n
1
v
o
l
(
A
i
)
)
=
1
2
(
c
u
t
(
A
i
,
A
‾
i
)
1
v
o
l
(
A
i
)
+
c
u
t
(
A
i
,
A
‾
i
)
1
v
o
l
(
A
i
)
)
=
c
u
t
(
A
i
,
A
‾
i
)
v
o
l
(
A
i
)
=
N
C
u
t
(
A
i
,
A
‾
i
)
\begin{array}{l} h_i^T Lh_i = \frac{1}{2}\sum\limits_{m = 1} {\sum\limits_{n = 1} {w_{mn} (h_{im} - h_{in} )^2 } } \\ \qquad = \frac{1}{2}(\sum\limits_{m \in A_i ,n \notin A_i } {w_{mn} } (\frac{1}{{\sqrt {vol(A_i )} }} - 0)^2 + \sum\limits_{m \notin A_i ,n \in A_i } {w_{mn} } (0 - \frac{1}{{\sqrt {vol(A_i )} }})^2 ) \\ \qquad = \frac{1}{2}(\sum\limits_{m \in A_i ,n \notin A_i } {w_{mn} } \frac{1}{{vol(A_i )}} + \sum\limits_{m \in A_i ,n \notin A_i } {w_{mn} } \frac{1}{{vol(A_i )}}) \\ \qquad = \frac{1}{2}(cut(A_i ,\overline A _i )\frac{1}{{vol(A_i )}} + cut(A_i ,\overline A _i )\frac{1}{{vol(A_i )}}) \\ \qquad = \frac{{cut(A_i ,\overline A _i )}}{{vol(A_i )}} \\ \qquad = N{\rm{Cut}}(A_i ,\overline A _i ) \\ \end{array}
hiTLhi=21m=1∑n=1∑wmn(him−hin)2=21(m∈Ai,n∈/Ai∑wmn(vol(Ai)1−0)2+m∈/Ai,n∈Ai∑wmn(0−vol(Ai)1)2)=21(m∈Ai,n∈/Ai∑wmnvol(Ai)1+m∈Ai,n∈/Ai∑wmnvol(Ai)1)=21(cut(Ai,Ai)vol(Ai)1+cut(Ai,Ai)vol(Ai)1)=vol(Ai)cut(Ai,Ai)=NCut(Ai,Ai)
\quad\quad 推导方式和RatioCut完全一致。也就是说,我们的优化目标仍然是
N
C
u
t
(
A
1
,
A
2
,
.
.
.
,
A
k
)
=
∑
i
=
1
k
h
i
T
L
h
i
=
∑
i
=
1
k
(
H
T
L
H
)
i
i
=
t
r
(
H
T
L
H
)
NCut({\rm{A}}_1 {\rm{,A}}_2 ,...,{\rm{A}}_k ) = \sum\limits_{i = 1}^k {h_i^T Lh_i = } \sum\limits_{i = 1}^k {(H^T LH)_{ii} = } tr(H^T LH)
NCut(A1,A2,...,Ak)=i=1∑khiTLhi=i=1∑k(HTLH)ii=tr(HTLH)
\quad\quad
但是,此时的
H
T
H
=
I
H^{T}H=I
HTH=I,,而是$ H^{T}DH=I$ , 推导如下:
h
i
T
L
h
i
=
∑
j
=
1
n
h
i
j
2
d
j
=
1
v
o
l
(
A
i
)
∑
v
j
∈
A
i
w
v
j
=
1
v
o
l
(
A
i
)
v
o
l
(
A
i
)
=
I
h_i^T Lh_i = \sum\limits_{j = 1}^n {h_{ij}^2 } d_j = \frac{1}{{vol(A_i )}}\sum\limits_{v_j \in A_i } {w_{v_j } } = \frac{1}{{vol(A_i )}}vol(A_i ) = I
hiTLhi=j=1∑nhij2dj=vol(Ai)1vj∈Ai∑wvj=vol(Ai)1vol(Ai)=I
arg
min
t
r
(
H
T
L
H
)
s
t
.
t
.
H
T
H
=
I
\arg \min \ \ tr(H^T LH)\qquad st.t.H^T H = I
argmin tr(HTLH)st.t.HTH=I
\quad\quad
此时我们的H中的指示向量h并不是标准正交基,所以在RatioCut里面的降维思想不能直接用。怎么办呢?其实只需要将指示向量矩阵H做一个小小的转化即可。
\quad\quad
我们令$ H=D^{-1/2}F$ , 则:$ H{T}LH=F{T}D{-1/2}LD{-1/2}F$ ,$ H{T}DH=F{T}F=I$ ,也就是说优化目标变成了:
arg
min
t
r
(
F
T
D
−
1
/
2
L
D
−
1
/
2
F
)
s
.
t
.
F
T
F
=
I
\arg \min tr(F^T D^{ - 1/2} LD^{ - 1/2} F) \qquad s.t.F^T F = I
argmintr(FTD−1/2LD−1/2F)s.t.FTF=I
\quad\quad
可以发现这个式子和RatioCut基本一致,只是中间的L变成了$ D{-1/2}LD{-1/2}$ 。这样我们就可以继续按照RatioCut的思想,求出$ D{-1/2}LD{-1/2}$ 的最小的前k个特征值,然后求出对应的特征向量,并标准化,得到最后的特征矩阵F,最后对F进行一次传统的聚类(比如K-Means)即可。
\quad\quad
一般来说,
D
−
1
/
2
L
D
−
1
/
2
D^{-1/2}LD^{-1/2}
D−1/2LD−1/2 相当于对拉普拉斯矩阵L做了一次标准化,即$ \frac {L_{ij}} {\sqrt {d_{i}* d_{j}}} $
四、谱聚类算法流程
\quad\quad 一般来说,谱聚类主要的注意点为相似矩阵的生成方式,切图的方式以及最后的聚类方法.
\quad\quad 最常用的相似矩阵的生成方式是基于高斯核距离的全连接方式;最常用的切图方式是Ncut。而到最后常用的聚类方法为K-Means。下面以Ncut总结谱聚类算法流程。
1、输出输出
\quad\quad 输入: 样本集$ D=(x_{1},x_{2},…,x_{n}) ,相似矩阵的生成方式 , 降维后的维度 ,相似矩阵的生成方式, 降维后的维度 ,相似矩阵的生成方式,降维后的维度 k_{1}$ , 聚类方法,聚类后的维度 $ k_{2}$ 。
\quad\quad 输出: 簇划分 C ( c 1 , c 2 , . . . c k 2 ) C(c_{1},c_{2},...c_{k_{2}}) C(c1,c2,...ck2)
2、具体步骤
(1)根据输入的相似矩阵的生成方式构建样本的相似矩阵S
(2)根据相似矩阵S 构建邻接矩阵W ,构建度矩阵D
(3)计算出拉普拉斯矩阵L
(4)构建标准化后的拉普拉斯矩阵
D
−
1
/
2
L
D
−
1
/
2
D^{−1/2}LD^{−1/2}
D−1/2LD−1/2
(5)计算 D − 1 / 2 L D − 1 / 2 D^{−1/2}LD^{−1/2} D−1/2LD−1/2 最小的$ k_{1}$
(6) 将各自对应的特征向量 f 组成的矩阵按行标准化,最终组成$ n \times k_{1}$ 维的特征矩阵F
(7)对F 中的每一行作为一个$ k_{1}$ 维的样本,共 n 个样本,用输入的聚类方法进行聚类,聚类维数为$ k_{2}$
(8)得到簇划分
C
(
c
1
,
c
2
,
.
.
.
c
k
2
)
C(c_{1},c_{2},...c_{k_{2}})
C(c1,c2,...ck2)
\quad\quad 谱聚类的关键步骤是构建拉普拉斯矩阵、求解特征值和特征向量,并利用降维和传统聚类算法对数据进行聚类。
五、谱聚类python实现
import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
def spectral_clustering(X, k1, k2):
# Step 1(根据实际应用选择): 构建样本的相似矩阵 S
# 在这里你可以根据你的数据集和相似度度量方式来构建相似矩阵 S
# Step 2: 构建邻接矩阵 W 和度矩阵 D
# 这里假设使用简单的相似度阈值方法来构建邻接矩阵 W
W = np.zeros((len(X), len(X)))
for i in range(len(X)):
for j in range(len(X)):
if i != j and np.linalg.norm(X[i] - X[j]) < 0.5: # 设置相似度阈值
W[i][j] = 1
D = np.diag(np.sum(W, axis=1))
# Step 3: 计算拉普拉斯矩阵 L
L = D - W
# Step 4: 构建标准化后的拉普拉斯矩阵
# 修改部分:使用伪逆来计算度矩阵的逆矩阵,避免奇异矩阵出现
D_sqrt_inv = np.sqrt(np.linalg.pinv(D))
L_normalized = np.dot(np.dot(D_sqrt_inv, L), D_sqrt_inv)
# Step 5: 计算 L_normalized 的最小的 k1 个特征值和对应的特征向量
eigenvalues, eigenvectors = np.linalg.eig(L_normalized)
indices = np.argsort(eigenvalues)[:k1]
F = eigenvectors[:, indices]
# Step 6: 对 F 中的每一行作为一个 k1 维的样本,按行标准化,得到特征矩阵 F
F_normalized = F / np.linalg.norm(F, axis=1, keepdims=True)
# Step 7: 使用 KMeans 算法对 F 进行聚类,得到聚类结果
kmeans = KMeans(n_clusters=k2)
labels = kmeans.fit_predict(F_normalized)
return labels
# 生成一些示例数据
np.random.seed(0)
X = np.random.randn(300, 2)
# 调用谱聚类函数
k1 = 5
k2 = 2
labels = spectral_clustering(X, k1, k2)
# 绘制聚类结果
plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='viridis')
plt.title('Spectral Clustering')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.show()
运行结果:
六、应用场景和未来展望
\quad\quad 谱聚类在各个领域都有着广泛的应用。
(1)在图像分割中,谱聚类可以将图像像素分成具有相似特征的区域;
(2)在社交网络分析中,谱聚类可以发现社区结构和用户群体;
(3)在生物信息学中,谱聚类可以对基因表达数据进行聚类分析,发现基因表达模式。
\quad\quad 未来,谱聚类技术有望在以下方面进一步发展:
(1)**大规模数据处理:**提高谱聚类算法的效率和可扩展性,以应对大规模数据的聚类需求。
(2)**结合深度学习:**将谱聚类与深度学习技术相结合,以提高对非线性结构和高维数据的处理能力。
(3)**增强稳健性:**进一步研究和改进谱聚类算法,提高其对噪声和异常值的鲁棒性。
\quad\quad 总的来说,谱聚类作为一种强大的聚类方法,在数据分析和机器学习领域具有广阔的应用前景,将在未来发展中继续发挥重要作用。