机器学习——聚类算法总结(一)
1 聚类算法介绍
1.1、基本形式描述
聚类算法是无监督学习的一个重要的应用方向,聚类算法将样本集中的样本划分成若干个不想交的子集,每个子集称为一个“簇”,通过这样的划分,每个簇可能对应于一些潜在的类别。需要说明的是这些分类事先是未知的,聚类仅仅能够自动的形成簇,但是簇对应的概念语义需要我们自己来命名和理解。
聚类算法的一般形式为:
- 给定样本集 D = [ X 1 , X 2 , . . . , X m ] D=[X_1,X_2,...,X_m] D=[X1,X2,...,Xm],D中包含m个没有标签的样本。
- 每一个样本 X i X_i Xi的形式为 [ X i 1 , X i 2 , . . . . X i n ] [X_{i1},X_{i2},....X_{in}] [Xi1,Xi2,....Xin]也就是每一个样本包含n个特征。
- 聚类算法将样本集合D划分成k个不同的簇,表示为 C 1 = [ X 1 , X 2 , . . . X k ] C_1=[X_1,X_2,...X_k] C1=[X1,X2,...Xk]∪ C 2 = [ X k + 1 , . . . . X k + i ] C_2=[X_{k+1},....X_{k+i}] C2=[Xk+1,....Xk+i]∪ C 3 C_3 C3,…∪ C k C_k Ck。并且有 C 1 ∩ C 2 ∩ C 3 , . . . ∩ C k = ∅ C_1∩C_2∩C_3,...∩C_k=∅ C1∩C2∩C3,...∩Ck=∅,我们自定义一个簇的表示为 λ i λ_i λi,则将所有的簇的表示可以描述为: [ λ 1 , λ 2 , . . . λ k ] [λ_1,λ_2,...λ_k] [λ1,λ2,...λk]。
1.2 聚类的性能度量
聚类的性能度量方法主要可以分成两个类别,第一个类别是将聚类的结果和某一个“参考模型”进行比较,这称为是外部指标,另外一种方式是直接比较聚类的结果,而不去参考其他模型的结果。这称为是内部指标。
1.2.1 外部指标的性能度量
假设,我们采用聚类算法划分出来的簇为 [ C 1 , C 2 , . . , C k ] [C_1,C_2,..,C_k] [C1,C2,..,Ck],而参考模型的聚类结果为 [ C 1 ∗ , C 2 ∗ , C 3 ∗ , . . . . . C s ∗ ] [C_{1}^*,C_{2}^*,C_{3}^*,.....C_{s}^*] [C1∗,C2∗,C3∗,.....Cs∗],同样,我们采用 λ i λ_i λi和 λ i ∗ λ_i^* λi∗作为聚类结果中第i个簇的表示,用 λ i ∗ λ_i^* λi∗作为参考模型中第i个簇的表示。下面定义一些计算为:
-
a
=
∣
S
S
∣
,
S
S
=
{
(
X
i
,
X
j
)
∣
X
i
∈
λ
i
,
X
j
∈
λ
i
,
X
i
∈
λ
i
∗
,
X
j
∈
λ
i
∗
,
i
<
j
}
a=|SS|,SS=\{(X_i,X_j)|X_i∈λ_i,X_j∈λ_i,X_i∈λ_i^*,X_j∈λ_i^*,i<j\}
a=∣SS∣,SS={(Xi,Xj)∣Xi∈λi,Xj∈λi,Xi∈λi∗,Xj∈λi∗,i<j}
简单的解释以下就是,SS表示的是 X i , X j X_i,X_j Xi,Xj无论是在聚类结果还是参考模型中都属于一个簇的样本集合。 -
b
=
∣
S
D
∣
,
S
D
=
{
(
X
i
,
X
j
)
∣
X
i
∈
λ
i
,
X
j
∈
λ
i
,
X
i
∈
λ
i
∗
,
X
j
∉
λ
i
∗
,
i
<
j
}
b=|SD|,SD=\{(X_i,X_j)|X_i∈λ_i,X_j∈λ_i,X_i∈λ_i^*,X_j∉λ_i^*,i<j\}
b=∣SD∣,SD={(Xi,Xj)∣Xi∈λi,Xj∈λi,Xi∈λi∗,Xj∈/λi∗,i<j}
简单的解释一下就是,SD表示 X i , X j X_i,X_j Xi,Xj在聚类结果中同一个簇,但是在参考模型中不属于一个簇的样本集合。 -
c
=
∣
D
S
∣
,
D
S
=
{
D
S
}
,
D
S
=
{
(
X
i
,
X
j
)
∣
X
i
∈
λ
i
,
X
j
∉
λ
i
,
X
i
∈
λ
i
∗
,
X
j
∈
λ
i
∗
,
i
<
j
}
c=|DS|,DS=\{DS\},DS=\{(X_i,X_j)|X_i∈λ_i,X_j∉λ_i,X_i∈λ_i^*,X_j∈λ_i^*,i<j\}
c=∣DS∣,DS={DS},DS={(Xi,Xj)∣Xi∈λi,Xj∈/λi,Xi∈λi∗,Xj∈λi∗,i<j}
DS表示 X i , X j X_i,X_j Xi,Xj在聚类结果中不属于一个簇,但是在参考模型中属于一个簇的样本集合。 -
d
=
∣
D
D
∣
,
D
D
=
{
(
X
i
,
X
j
)
∣
X
i
∈
λ
i
,
X
j
∉
λ
i
,
X
i
∈
λ
i
∗
,
X
j
∉
λ
i
∗
,
i
<
j
}
d=|DD|,DD=\{(X_i,X_j)|X_i∈λ_i,X_j∉λ_i,X_i∈λ_i^*,X_j∉λ_i^*,i<j\}
d=∣DD∣,DD={(Xi,Xj)∣Xi∈λi,Xj∈/λi,Xi∈λi∗,Xj∈/λi∗,i<j}
DD表示的是在聚类结果中属于同一个簇,在参考模型中也不属于一个簇的样本集合。
由于,每一个样本只能属于一个簇,所以有
a
+
b
+
c
+
d
=
m
(
m
−
1
)
2
a+b+c+d=\frac{m(m-1)}{2}
a+b+c+d=2m(m−1)
外部指标1:Jaccard 系数:
J
C
=
a
a
+
b
+
c
JC=\frac{a}{a+b+c}
JC=a+b+ca
外部指标2:FMI指数:
F
M
I
=
a
a
+
b
∗
a
a
+
c
FMI=\sqrt{\frac{a}{a+b}*\frac{a}{a+c}}
FMI=a+ba∗a+ca
外部指标3:Rand指数:
R
I
=
2
(
a
+
d
)
m
(
m
−
1
)
RI=\frac{2(a+d)}{m(m-1)}
RI=m(m−1)2(a+d)
对于上面的指标,值越大聚类的效果就越好。
1.2.2 内部指标度量
对于聚类生成的结果,定义如下几个公式:
a
v
g
(
C
i
)
=
2
∣
C
i
∣
(
∣
C
i
∣
−
1
)
∑
1
≤
i
<
j
≤
∣
C
i
∣
d
i
s
t
(
X
i
,
X
j
)
avg(C_i)=\frac{2}{|C_i|(|C_i|-1)}∑_{1≤i<j≤|C_i|}dist(X_i,X_j)
avg(Ci)=∣Ci∣(∣Ci∣−1)21≤i<j≤∣Ci∣∑dist(Xi,Xj)
其中dist用于计算的是不同的两个样本
X
i
,
X
j
X_i,X_j
Xi,Xj之间的距离,
a
v
g
(
C
i
)
avg(C_i)
avg(Ci)表示计算簇
C
i
C_i
Ci下面的样本的之间的距离的平均值。
d
i
a
m
(
C
i
)
=
m
a
x
1
≤
i
<
j
≤
∣
C
∣
d
i
s
t
(
X
i
,
X
j
)
diam(C_i)=max_{1≤i<j≤|C|}dist(X_i,X_j)
diam(Ci)=max1≤i<j≤∣C∣dist(Xi,Xj)
d
i
a
m
(
C
i
)
diam(C_i)
diam(Ci)表示簇
C
i
C_i
Ci下面所有样本中距离最大的两个样本之间的距离值。
d
m
i
n
(
C
i
,
C
j
)
=
m
i
n
X
i
∈
C
i
,
X
j
∈
C
j
d
i
s
t
(
X
i
,
X
j
)
d_{min}(C_i,C_j)=min_{X_i∈C_i,X_j∈C_j}dist(X_i,X_j)
dmin(Ci,Cj)=minXi∈Ci,Xj∈Cjdist(Xi,Xj)
d
m
i
n
(
C
i
,
C
j
)
d_{min}(C_i,C_j)
dmin(Ci,Cj)表示两个簇之间的样本的最小距离。
d
c
e
n
(
C
i
,
C
j
)
=
d
i
s
t
(
μ
i
,
μ
j
)
d_{cen}(C_i,C_j)=dist(μ_i,μ_j)
dcen(Ci,Cj)=dist(μi,μj)
d
c
e
n
(
C
i
,
C
j
)
d_{cen}(C_i,C_j)
dcen(Ci,Cj)表示两个簇之间的中心点之间的距离,
μ
i
μ_i
μi表示第i个簇的中心点。
μ
i
=
1
C
i
∑
i
=
1
∣
C
i
∣
X
i
,
X
i
∈
∣
C
∣
μ_i=\frac{1}{C_i}∑_{i=1}^{|C_i|}X_i,X_i∈|C|
μi=Ci1i=1∑∣Ci∣Xi,Xi∈∣C∣
内部指标1:DB 系数
D
B
I
=
1
k
∑
i
=
1
k
m
a
x
j
≠
i
(
a
v
g
(
C
i
)
+
a
v
g
(
C
j
)
d
c
e
n
(
C
i
,
C
j
)
)
DBI=\frac{1}{k}∑_{i=1}^kmax_{j≠i}(\frac{avg(C_i)+avg(C_j)}{d_{cen}(C_i,C_j)})
DBI=k1i=1∑kmaxj=i(dcen(Ci,Cj)avg(Ci)+avg(Cj))
DBI指数就是不同簇内部距离的平均值和不同簇之间的距离的比值的求和。
内部指标2:Dunn指数
D
I
=
m
i
n
1
≤
i
≤
k
{
m
i
n
j
≠
i
d
m
i
n
(
C
i
,
C
j
)
m
a
x
1
≤
l
≤
k
d
i
a
m
(
C
l
)
}
DI = min_{1≤i≤k}\{min_{j≠i}\frac{d_{min}(C_i,C_j)}{max_{1≤l≤k}diam(C_l)}\}
DI=min1≤i≤k{minj=imax1≤l≤kdiam(Cl)dmin(Ci,Cj)}
DBI指数越小越好,DI指数越大越好。
1.3 距离计算
对于上面的公式,我们可以发现,其基础在于dist距离的计算,其中最常见的距离计算为闵可夫斯基距离的计算。其基本公式为:
d
i
s
t
m
k
(
X
i
,
X
j
)
=
(
∑
u
=
1
n
∣
X
i
u
−
X
j
u
∣
p
)
1
p
dist_{mk}(X_i,X_j)=(∑_{u=1}^n|X_{iu}-X_{ju}|^p)^{\frac{1}{p}}
distmk(Xi,Xj)=(u=1∑n∣Xiu−Xju∣p)p1
其中,n表示样本的维度。
- 当p等于1的时候,上述公式变成了:
d i s t m k ( X i , X j ) = ( ∑ u = 1 n ∣ X i u − X j u ∣ ) dist_{mk}(X_i,X_j)=(∑_{u=1}^n|X_{iu}-X_{ju}|) distmk(Xi,Xj)=(u=1∑n∣Xiu−Xju∣)
这种距离的计算方式称为曼哈顿距离。 - 当p等于2的时候,上述公式变成了:
d i s t m k ( X i , X j ) = ( ∑ u = 1 n ∣ X i u − X j u ∣ 2 ) 1 2 dist_{mk}(X_i,X_j)=(∑_{u=1}^n|X_{iu}-X_{ju}|^2)^{\frac{1}{2}} distmk(Xi,Xj)=(u=1∑n∣Xiu−Xju∣2)21
这种距离的计算方式也称为欧式距离。
2、K-means聚类
K-means聚类是最为简单的一种聚类方式,假设聚类结果一共有k个簇,
u
i
u_i
ui表示第i个簇的中心点,我们的目标是最小化平方误差:
E
=
∑
i
=
1
k
∑
X
∈
C
i
∣
∣
X
−
u
i
∣
∣
2
E=∑_{i=1}^k∑_{X∈C_i}||X-u_i||^2
E=i=1∑kX∈Ci∑∣∣X−ui∣∣2
也就是先对每一个簇下面的各个样本计算与中心的距离之和,然后在对所有簇求和。当距离达到最小的时候,意味着聚类的效果达到了最优。但是想要找到最小的距离值是一个NP问题,所以在K-means中采用了贪心算法,找到近似解。
2.1 K-means算法描述
注意:在K-means算法,唯一的参数是指定的分成簇的个数K。
2.2 学习向量化算法LVQ
在上述描述的K-means算法中,所有的样本初始的时候都是没有类标签的,也就是K-means是一种完全监督的学习。在LVQ算法中,假设数据样本时带有类别的标签的,学习的过程会利用这些标签信息来辅助进行聚类。
在LVQ算法中,样本集合D的形式如下:
D
=
{
(
X
1
,
Y
1
)
,
(
X
2
,
Y
2
)
,
.
.
.
.
,
(
X
m
,
Y
m
)
}
D=\{(X_1,Y_1),(X_2,Y_2),....,(X_m,Y_m)\}
D={(X1,Y1),(X2,Y2),....,(Xm,Ym)}
其中
Y
i
Y_i
Yi表示样本
X
i
X_i
Xi的类别标签。每一个样本的维度为n,也就是
X
i
=
[
X
i
1
,
X
i
2
,
.
.
.
,
X
i
n
]
X_i=[X_{i1},X_{i2},...,X_{in}]
Xi=[Xi1,Xi2,...,Xin]
LVQ的目标:
LVQ学习的目标是学习出各个簇的表示向量
p
1
,
p
2
,
.
.
.
,
p
k
{p_1,p_2,...,p_k}
p1,p2,...,pk,一共有k个簇,每一个
p
i
p_i
pi的维度为n。
首先,我们对各个簇的表示向量 p i p_i pi进行随机初始化。并且给这些向量分配k个标签,用于后续的计算。记为 [ t 1 , t 2 , . . . , t k ] [t_1,t_2,...,t_k] [t1,t2,...,tk]
训练的过程是一个迭代的过程,随机从样本集合中抽取一个样本
(
X
i
,
Y
i
)
(X_i,Y_i)
(Xi,Yi),分别计算其和每一个簇的表示向量的的距离,
d
j
i
=
∣
∣
X
i
−
p
j
∣
∣
2
d_{ji}=||X_i-p_j||^2
dji=∣∣Xi−pj∣∣2,找到距离最小的
p
j
p_j
pj,将
Y
i
Y_i
Yi和
p
j
p_j
pj的标签进行比较,如果两个标签相同,则有新的
p
j
p_j
pj为:
p
j
n
e
w
=
p
j
+
η
∗
(
X
i
−
p
j
)
p_j^{new}=p_j+η*(X_i-p_j)
pjnew=pj+η∗(Xi−pj)
否则:
p
j
n
e
w
=
p
j
−
η
∗
(
X
i
−
p
j
)
p_j^{new}=p_j-η*(X_i-p_j)
pjnew=pj−η∗(Xi−pj)
2.2.1 LVQ算法的形式化描述
2.2.3 更新公式的分析
在上面的描述中,我们给出了两个簇的表示向量的更新公式:
如果两个标签相同,则有新的
p
j
p_j
pj为:
p
j
n
e
w
=
p
j
+
η
∗
(
X
i
−
p
j
)
p_j^{new}=p_j+η*(X_i-p_j)
pjnew=pj+η∗(Xi−pj)
否则:
p
j
n
e
w
=
p
j
−
η
∗
(
X
i
−
p
j
)
p_j^{new}=p_j-η*(X_i-p_j)
pjnew=pj−η∗(Xi−pj)
我们来简单的分析一下,当标签相同的时候,更新后的
p
j
n
e
w
p_j^{new}
pjnew与样本
X
i
X_i
Xi的距离为:
∣
∣
X
i
−
p
j
n
e
w
∣
∣
2
=
∣
∣
X
i
−
p
j
−
η
∗
(
X
i
−
p
j
)
∣
∣
2
=
(
1
−
η
)
∣
∣
X
i
−
p
j
∣
∣
2
||X_i-p_j^{new}||_2=||X_i-p_j-η*(X_i-p_j)||_2=(1-η)||X_i-p_j||_2
∣∣Xi−pjnew∣∣2=∣∣Xi−pj−η∗(Xi−pj)∣∣2=(1−η)∣∣Xi−pj∣∣2
其中η∈[0,1],所以可以判断出距离变小,也就是
p
j
p_j
pj更加接近于
X
i
X_i
Xi。
当标签不同的时候:
∣
∣
X
i
−
p
j
n
e
w
∣
∣
2
=
∣
∣
X
i
−
p
j
+
η
∗
(
X
i
−
p
j
)
∣
∣
2
=
(
1
+
η
)
∣
∣
X
i
−
p
j
∣
∣
2
||X_i-p_j^{new}||_2=||X_i-p_j+η*(X_i-p_j)||_2=(1+η)||X_i-p_j||_2
∣∣Xi−pjnew∣∣2=∣∣Xi−pj+η∗(Xi−pj)∣∣2=(1+η)∣∣Xi−pj∣∣2
可以判断出距离变大,也就是
p
j
p_j
pj更加疏远于
X
i
X_i
Xi。
训练结束之后,我们就获得了最终的所有簇的向量表示 p 1 , p 2 , . . . , p k {p_1,p_2,...,p_k} p1,p2,...,pk,下一步就可以利用这些簇的表示对其他的样本空间,根据距离进行划分。
3 参考
- 周志华 《机器学习》