谱聚类做的是在某个距离函数的作用下,提取目标的二阶微分特征,根据特征进行聚类。
步骤:
- 有N个样本。
- 根据径向基函数(一种距离度量函数)获得点与点之间的距离关系。它们可以构成一个N×N的相似度对称矩阵W。
- 将S的每一行元素相加,并将结果放在对角上,获得对角的度矩阵D,尺寸依然是N×N。
- 获得拉普拉斯矩阵L = D - W。这个做法虽然看起来不像二阶微分,但确实是图的二阶微分,详情看这里拉普拉斯矩阵的含义
- 计算L的前K个特征值,并获得特征向量。K是你想聚类的类别数。将K个特征向量拼成N×K的特征矩阵S。这一步可以看作是对每个点相较于其他点的特征提取,即第i行就代表第i个点在全局中的特征。
- 以行为向量,进行 K-means聚类。
谱聚类
类似于混合高斯分布GMM,K-means等聚类方法,在遇到以下这一类数据的时候都会望洋兴叹。
简单来说,数据不是个凸集。
谱聚类就能很好地解决这类聚类问题。(当然,DBSCAN也能)
原理
谱聚类的思想发源于图。在图中,我们可以很轻易地用cut(切割)的方式(即切割边),使图一分为二,然后说这两部分就是两类数据。而图中的边代表两个节点之间的相似度。
这是我随便画的一个图。
可以看到我用绿线将这6个节点分为了两派,A和B。
我令
i
,
j
i,j
i,j为边连接的两个点的序号,可以知道相似度
w
i
,
j
=
{
K
(
x
i
,
x
j
)
(
i
,
j
)
∈
E
0
o
t
h
e
r
w
i
s
e
w_{i,j}=\left\{ \begin{aligned} K(x_i, x_j) && (i,j)∈E\\ 0 &&otherwise \\ \end{aligned} \right.
wi,j={K(xi,xj)0(i,j)∈Eotherwise
其中,
K
(
x
i
,
x
j
)
K(x_i,x_j)
K(xi,xj)是计算相似度的函数,一般用高斯核函数。E代表边的集合,(i,j)所在的边在E中.
接下来,我假设我将一个图
V
V
V切割成了
k
k
k份,计算这个图的cut分数:
c
u
t
(
V
)
=
c
u
t
(
A
1
,
A
2
,
.
.
.
,
A
k
)
=
∑
i
=
1
k
W
(
A
i
,
A
‾
i
)
=
∑
i
=
1
k
W
(
A
i
,
V
)
−
W
(
A
i
,
A
i
)
cut(V) = cut(A_1, A_2, ..., A_k) = \sum_{i=1}^{k}W(A_i, \overline A_i) \\ = \sum_{i=1}^{k} W(A_i, V) - W(A_i,A_i)
cut(V)=cut(A1,A2,...,Ak)=i=1∑kW(Ai,Ai)=i=1∑kW(Ai,V)−W(Ai,Ai)
c
u
t
(
V
)
cut(V)
cut(V)计算的是各个子图之间的相似度分数,所以很显然,我们的目标是:
m
i
n
c
u
t
(
V
)
min cut(V)
mincut(V)
或者说是
arg min
A
i
.
.
.
A
k
c
u
t
(
V
)
\argmin_{A_i...A_k} cut(V)
Ai...Akargmincut(V)
也就是说,
c
u
t
(
V
)
cut(V)
cut(V)就是我们切割图的
l
o
s
s
loss
loss;最小化子图之间的相关度,就是我们的目标。
Ncut
由于子图节点数的差异,点多的和点少的子图的
W
(
A
i
,
A
‾
i
)
W(A_i, \overline A_i)
W(Ai,Ai)直接比较是没有意义的,所以最好做个平均,即,将子图的
W
(
A
i
,
A
‾
i
)
W(A_i, \overline A_i)
W(Ai,Ai)平均到子图内的每个点上。用平均值代表该子图对其他子图的相似度。
但武断地用平均值作为子图的相似度,缺少道理。
我们不如做个normalization。加了normalization的cut被叫做Ncut。
N
c
u
t
Ncut
Ncut具体做法是:
N
c
u
t
(
V
)
=
∑
i
=
1
k
W
(
A
i
,
A
‾
i
)
∑
i
∈
A
i
∑
j
=
1
N
w
i
,
j
Ncut(V) = \sum_{i=1}^{k} \frac {W(A_i, \overline A_i)}{\sum _{i∈A_i}\sum_{j=1}^{N}w_{i,j}}
Ncut(V)=i=1∑k∑i∈Ai∑j=1Nwi,jW(Ai,Ai)
增加了一个分母,它是将 A i A_i Ai内的所有点相对于其他所有点的相似度加和,代表了 A i A_i Ai对其他所有点的相似度。而分子是 A i A_i Ai内的所有点相对于除了 A i A_i Ai的点的相似度。所以为了压低 N c u t ( V ) Ncut(V) Ncut(V),必须要求 A i A_i Ai自己的内聚性要高,同时对其他子图又有低相似度。
转换
N
c
u
t
(
V
)
Ncut(V)
Ncut(V)套了很多的
∑
\sum
∑符号。这很恼人。
我们想方设法将它变成矩阵计算的形式,最终想到,计算对角矩阵的trace(迹)正是连加的另一种形式。
所以如下变换:
t
r
(
[
W
(
A
1
,
A
‾
1
)
.
.
.
0
0
W
(
A
2
,
A
‾
2
)
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
0
0
.
.
.
W
(
A
k
,
A
‾
k
)
]
[
∑
i
∈
A
1
∑
j
=
1
N
w
i
,
j
.
.
.
.
.
.
0
0
∑
i
∈
A
2
∑
j
=
1
N
w
i
,
j
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
0
0
.
.
.
.
.
.
∑
i
∈
A
k
∑
j
=
1
N
w
i
,
j
]
−
1
)
tr\begin{pmatrix}\\ \begin {bmatrix} \\ W(A_1, \overline A_1) & ...& &0 \\ 0 & W(A_2,\overline A_2)&...&... \\ ... & ... & ...&0\\ 0 & ...&&W(A_k,\overline A_k) \end{bmatrix} \begin{bmatrix} \\ \sum _{i∈A_1}\sum_{j=1}^{N}w_{i,j}& ...&...&0 \\ 0 & \sum _{i∈A_2}\sum_{j=1}^{N}w_{i,j}&...&... \\ ... & ...&...&0 \\ 0&...&...&\sum _{i∈A_k}\sum_{j=1}^{N}w_{i,j} \\ \end{bmatrix}^{-1} \end{pmatrix}
tr⎝⎜⎜⎜⎜⎜⎛⎣⎢⎢⎢⎢⎡W(A1,A1)0...0...W(A2,A2)............0...0W(Ak,Ak)⎦⎥⎥⎥⎥⎤⎣⎢⎢⎢⎢⎢⎡∑i∈A1∑j=1Nwi,j0...0...∑i∈A2∑j=1Nwi,j..................0...0∑i∈Ak∑j=1Nwi,j⎦⎥⎥⎥⎥⎥⎤−1⎠⎟⎟⎟⎟⎟⎞
请自己看懂上面的式子,至关重要。
我们将变换简写为
t
r
(
O
P
−
1
)
tr(OP^{-1})
tr(OP−1)
暂时搁置
O
O
O矩阵,
P
P
P矩阵的化简比较简单。
P的转换
首先新建一个值
Y
=
[
y
1
,
y
2
,
.
.
.
,
y
n
]
Y=[y_1,y_2,...,y_n]
Y=[y1,y2,...,yn]Y的尺寸是(k×n), k是类别数量,n是样本数量。
所以有
Y
Y
T
=
[
y
1
,
y
2
,
.
.
.
,
y
n
]
[
y
1
y
2
.
.
.
y
n
]
YY^T=\begin {bmatrix} y_1,y_2,...,y_n\\ \end{bmatrix} \begin {bmatrix} y_1\\ y_2\\ ...\\ y_n\\ \end{bmatrix}
YYT=[y1,y2,...,yn]⎣⎢⎢⎡y1y2...yn⎦⎥⎥⎤
Y
Y
T
YY^T
YYT尺寸为(k×k)。它的计算结果是个对角矩阵,每个在(i,i)上的对角元素都代表着n个样本中属于i类的有几个。写成矩阵形式,就是
Y
Y
T
=
[
∑
i
∈
A
1
1
.
.
.
0
0
∑
i
∈
A
2
1
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
0
0
.
.
.
∑
i
∈
A
k
1
)
]
YY^T=\begin {bmatrix} \\ \sum_{i∈A_1} 1 & ...& &0 \\ 0 & \sum_{i∈A_2} 1&...&... \\ ... & ... & ...&0\\ 0 & ...&&\sum_{i∈A_k} 1) \end{bmatrix}
YYT=⎣⎢⎢⎢⎢⎡∑i∈A110...0...∑i∈A21............0...0∑i∈Ak1)⎦⎥⎥⎥⎥⎤这个形式和矩阵
P
P
P太像了,只是缺少了
d
i
d_i
di,但不要紧,接下来这个
Y
D
Y
T
=
P
YDY^T=P
YDYT=P
D
=
[
d
1
d
2
.
.
.
d
n
]
=
d
i
a
g
(
[
w
11
.
.
.
.
.
.
w
1
n
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
w
n
1
.
.
.
.
.
.
w
n
n
]
[
1
1
.
.
.
1
]
)
D=\begin{bmatrix} d_1&&&&\\ &d_2&&\\ &&...\\ &&&d_n\\ \end{bmatrix}=diag\begin{pmatrix}\begin{bmatrix} w_{11}&...&...&w_{1n}&\\ ...&...&...&...\\ ...&...&...&...\\ w_{n1}&...&...&w_{nn}\\ \end{bmatrix}\begin{bmatrix}1\\ 1\\ ...\\ 1\\ \end{bmatrix}\end{pmatrix}
D=⎣⎢⎢⎡d1d2...dn⎦⎥⎥⎤=diag⎝⎜⎜⎛⎣⎢⎢⎡w11......wn1........................w1n......wnn⎦⎥⎥⎤⎣⎢⎢⎡11...1⎦⎥⎥⎤⎠⎟⎟⎞就完全成立了。
O的转换
W
(
A
i
,
A
‾
i
)
=
W
(
A
i
,
V
)
−
W
(
A
i
,
A
i
)
W(A_i, \overline A_i)=W(A_i, V)-W(A_i, A_i)
W(Ai,Ai)=W(Ai,V)−W(Ai,Ai)
W
(
A
i
,
V
)
=
Y
D
Y
T
W(A_i, V)=YDY^T
W(Ai,V)=YDYT,这是已经有的了。
对于后者,我们可以近似地把它写成:
W
(
A
i
,
A
i
)
≈
Y
W
Y
T
W(A_i, A_i) ≈ YWY^T
W(Ai,Ai)≈YWYT注意注意,这里需要仔细理解。
W
(
A
i
,
A
i
)
W(A_i, A_i)
W(Ai,Ai)是个对角矩阵;由于
W
W
W不是对角矩阵,
Y
W
Y
T
YWY^T
YWYT不是对角矩阵。为什么可以用后者替代前者?
因为
W
(
A
i
,
V
)
W(A_i, V)
W(Ai,V)是对角矩阵,两者相减,会保留
W
(
A
i
,
A
i
)
W(A_i, A_i)
W(Ai,Ai)的非对角数据。但这些数据在求
t
r
a
c
e
trace
trace时没有任何用处,
t
r
a
c
e
trace
trace只计算对角数值的和。所以如此替换也不会对结果产生影响。
所以现在有
W
(
A
i
,
A
‾
i
)
=
W
(
A
i
,
V
)
−
W
(
A
i
,
A
i
)
=
Y
D
Y
T
−
Y
W
Y
T
=
Y
L
Y
T
W(A_i, \overline A_i)=W(A_i, V)-W(A_i, A_i)=YDY^T-YWY^T=YLY^T
W(Ai,Ai)=W(Ai,V)−W(Ai,Ai)=YDYT−YWYT=YLYT这才是拉普拉斯矩阵L产生的原因。
目标函数
Y = arg min Y t r ( Y L Y T ⋅ ( Y D Y T ) − 1 ) Y = \argmin_Y tr(YLY^T·(YDY^T)^{-1}) Y=Yargmintr(YLYT⋅(YDYT)−1)