目录
1. 聚类任务
聚类是一种常见的无监督算法,其主要任务是将数据集根据特征自动分为若干个不相交的子集,达到“物以聚类”的效果。每个子集称为一个“簇”,每个簇中的元素具有一定的相似性。聚类主要分为kmeans聚类、密度聚类(DBSCAN)、层次聚类等。
2. 性能度量
对于聚类的效果,我们也需要使用一些指标来评估其好坏,作为无监督算法,其无法像有监督学习一样,通过误差率等指标来衡量模型效果,直观上看,其度量标准为:簇内相似度高,簇间相似度低。
周志华的《机器学习》里提到了2种用于衡量聚类的方法:
- 外部指标:将结果与某个“参考模型”比较,如领域专家给出的划分结果
- 内部指标:直接考察聚类结果
2.1 外部指标
在给出具体的指标前,书上给出了一些参数的意义如下:
给出具体的例子,一共有5个样本,
聚类结果:
(
x
1
,
x
2
,
x
3
)
∈
C
1
(x_1,x_2,x_3) \in C_1
(x1,x2,x3)∈C1类
(
x
4
,
x
5
)
∈
C
2
(x_4,x_5) \in C_2
(x4,x5)∈C2类
参考模型:
(
x
1
,
x
2
,
x
4
)
∈
C
1
(x_1,x_2,x_4) \in C_1
(x1,x2,x4)∈C1类
(
x
3
,
x
5
)
∈
C
2
(x_3,x_5) \in C_2
(x3,x5)∈C2类
a
=
∣
S
S
∣
=
∣
(
x
1
,
x
2
)
∣
=
1
a = |SS| = |(x_1,x_2)| = 1
a=∣SS∣=∣(x1,x2)∣=1
b
=
∣
S
D
∣
=
∣
(
x
1
,
x
3
)
,
(
x
2
,
x
3
)
,
(
x
4
,
x
5
)
∣
=
3
b = |SD| = |(x_1,x_3),(x_2,x_3),(x_4,x_5)| = 3
b=∣SD∣=∣(x1,x3),(x2,x3),(x4,x5)∣=3
c
=
∣
D
S
∣
=
∣
(
x
1
,
x
4
)
,
(
x
2
,
x
4
)
∣
,
(
x
3
,
x
5
)
∣
=
3
c = |DS| = |(x_1,x_4),(x_2,x_4)|,(x_3,x_5)| =3
c=∣DS∣=∣(x1,x4),(x2,x4)∣,(x3,x5)∣=3
d
=
∣
D
D
∣
=
∣
(
x
1
,
x
5
)
,
x
2
,
x
5
)
,
x
3
,
x
4
)
∣
=
3
d = |DD| = |(x_1,x_5),x_2,x_5),x_3,x_4)| = 3
d=∣DD∣=∣(x1,x5),x2,x5),x3,x4)∣=3
a
+
b
+
c
+
d
=
m
(
m
−
1
)
2
a+b+c+d = \frac{m(m-1)}{2}
a+b+c+d=2m(m−1)
基于这些参数,有以下用于衡量聚类效果的外部指标:
- Jaccard系数(JC)
J C = a a + b + c JC = \frac{a}{a+b+c} JC=a+b+ca - FM指数
F M I = a a + b ⋅ a a + c FMI = \sqrt{\frac{a}{a+b}\cdot\frac{a}{a+c}} FMI=a+ba⋅a+ca - Rand指数
R a n d = a + b m ( m − 1 ) 2 = 2 ( a + d ) m ( m − 1 ) Rand= \frac{a+b}{\frac{m(m-1)}{2}} = \frac{2(a+d)}{m(m-1)} Rand=2m(m−1)a+b=m(m−1)2(a+d)
显然,上述三个指标都是[0,1]区间,且值越大越好
2.2 内部指标
聚类没有参考的模型,因此更多参考内部指标,先给出以下定义:
给出以下例子,假设在一维空间中,有以下8个样本,共有3类(C=3)
a
v
g
(
C
)
avg(C)
avg(C)表示簇内样本平均距离
a
v
g
(
C
1
)
=
∣
x
1
−
x
2
∣
+
∣
x
1
−
x
3
∣
+
∣
x
2
−
x
3
∣
C
3
2
=
∣
x
1
−
x
2
∣
+
∣
x
1
−
x
3
∣
+
∣
x
2
−
x
3
∣
3
\begin{aligned} avg(C_1) = \frac{|x_1-x_2|+|x_1-x_3|+ |x_2-x_3|}{C_3^2} \\ = \frac{|x_1-x_2|+|x_1-x_3|+ |x_2-x_3|}{3} \end{aligned}
avg(C1)=C32∣x1−x2∣+∣x1−x3∣+∣x2−x3∣=3∣x1−x2∣+∣x1−x3∣+∣x2−x3∣
d
i
a
m
(
C
)
diam(C)
diam(C)表示簇内样本最大距离
d
i
a
m
(
C
1
)
=
∣
x
1
−
x
3
∣
diam(C_1) = |x_1 - x_3|
diam(C1)=∣x1−x3∣
d
m
i
n
(
C
i
,
C
j
)
dmin(C_i,C_j)
dmin(Ci,Cj)表示簇内
C
i
C_i
Ci和簇
C
j
C_j
Cj最小距离
d
m
i
n
(
C
1
,
C
2
)
=
∣
x
3
−
x
4
∣
dmin(C_1,C_2)= |x_3 - x_4|
dmin(C1,C2)=∣x3−x4∣
d
c
e
n
(
C
i
,
C
j
)
dcen(C_i,C_j)
dcen(Ci,Cj)表示簇内
C
i
C_i
Ci和簇
C
j
C_j
Cj中心点的距离
μ
1
=
x
1
+
x
2
+
x
3
3
μ
2
=
x
4
+
x
5
2
d
c
e
n
(
C
1
,
C
2
)
=
∣
μ
1
−
μ
2
∣
\begin{aligned} \mu_1 &= \frac{x_1+x_2+x_3}{3} \\ \mu_2 &= \frac{x_4+x_5}{2} \\ dcen(C_1,&C_2) =|\mu_1 - \mu_2| \end{aligned}
μ1μ2dcen(C1,=3x1+x2+x3=2x4+x5C2)=∣μ1−μ2∣
内部指标主要是以下几个:
- DB指数(DBI)
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 ( μ i , μ j ) ) DBI= \frac1k\sum_{i=1}^k\underset{j \ne i}{max}(\frac{avg(C_i)+avg(C_j)}{dcen(\mu_i,\mu_j)}) DBI=k1i=1∑kj=imax(dcen(μi,μj)avg(Ci)+avg(Cj))
DBI指数取了簇内平均距离和簇间中心点距离比值是最大值,由于我们希望簇内平均距离更小,簇间中心点距离更大,于是这个比值是越小越好 - Dunn指数(DI)
D I = m i n 1 ≤ i ≤ k [ m i n j ≠ i ( d m i n ( C i , C j ) m i n 1 ≤ l ≤ k d i a m ( C l ) ) ] DI = \underset{1 \le i \le k}{min} [\underset{j \ne i}{min}(\frac{dmin(C_i,C_j)}{ \underset{1 \le l \le k}{min}diam(C_l)})] DI=1≤i≤kmin[j=imin(1≤l≤kmindiam(Cl)dmin(Ci,Cj))]
DI算法是取簇间距离最小值与簇内间距最大比值的最小值,此时,DI指数应该是越大越好
3. 距离计算
3.1 有序数据
对于取值连续的数据,距离的计算比较直观和简单。
距离的定义必须要满足以下几个性质:
非负性:
d
i
s
t
(
x
i
,
x
j
)
≥
0
dist(x_i,x_j) \ge 0
dist(xi,xj)≥0
同一性:
d
i
s
t
(
x
i
,
x
j
)
=
0
dist(x_i,x_j) = 0
dist(xi,xj)=0 当且仅当
x
i
=
x
j
x_i = x_j
xi=xj
对称性:
d
i
s
t
(
x
i
,
x
j
)
=
0
=
d
i
s
t
(
x
j
,
x
i
)
dist(x_i,x_j) = 0 = dist(x_j,x_i)
dist(xi,xj)=0=dist(xj,xi)
直递性:
d
i
s
t
(
x
i
,
x
j
)
≤
d
i
s
t
(
x
i
,
x
k
)
+
d
i
s
t
(
x
k
,
x
j
)
dist(x_i,x_j) \le dist(x_i,x_k) + dist(x_k,x_j)
dist(xi,xj)≤dist(xi,xk)+dist(xk,xj)
由于在knn中有关于距离的介绍,这里不再赘述,可以参考:
分类算法 - k近邻算法(原理、kd树)
3.2 无序数据
如果变量的取值为离散值,如{火车、飞机、轮船}这样的无序数据,不能直接采用3.1节的距离,可以用VDM距离来度量属性取值的差异
V
D
M
p
(
a
,
b
)
=
∑
i
=
1
k
∣
m
u
,
a
,
i
m
u
,
a
−
m
u
,
b
,
i
m
u
,
b
∣
p
VDM_p(a,b) = \sum_{i=1}^k|\frac{m_{u,a,i}}{m_{u,a}}- \frac{m_{u,b,i}}{m_{u,b}}|^p
VDMp(a,b)=i=1∑k∣mu,amu,a,i−mu,bmu,b,i∣p
m
u
,
a
,
i
m_{u,a,i}
mu,a,i表示在第
i
i
i个样本簇中在属性
u
u
u上取值为a的样本数,k为簇数,
m
u
,
a
m_{u,a}
mu,a表示属性u上取值为a的样本数
3.3 混合数据
对于混合数据,可以采用闵可夫斯基距离和VDM结合的方式,
4. 原型聚类
4.1 k-means聚类
给定样本集
D
=
{
x
1
,
x
2
.
.
.
,
x
n
}
D= \lbrace x_1,x_2...,x_n \rbrace
D={x1,x2...,xn}, k均值算法针对聚类所得簇划分
C
=
{
C
1
,
C
2
,
.
.
.
,
C
k
}
C=\lbrace C_1,C_2,...,C_k \rbrace
C={C1,C2,...,Ck},最小化平方误差
E
=
∑
i
=
1
k
∑
x
∈
C
i
∣
∣
x
−
μ
i
∣
∣
2
2
E = \sum_{i=1}^k\sum_{x \in C_i} ||x - \mu_i||_2^2
E=i=1∑kx∈Ci∑∣∣x−μi∣∣22
其中,
μ
i
=
1
C
i
∑
x
∈
C
i
x
\mu_i = \frac{1}{C_i}\sum_{x \in C_i} x
μi=Ci1∑x∈Cix是簇
C
i
C_i
Ci的均值向量,直观上看,刻画了簇内样本围绕簇均值向量的紧密程度,E越小,簇内样本相似程度越高。
由于这是一个NP难的问题,k-means采用贪心策略,用迭代的方式进行求解。算法的具体流程如下:
输入:样本集 D = { x 1 , x 2 . . . , x n } D= \lbrace x_1,x_2...,x_n \rbrace D={x1,x2...,xn}、簇个数k
过程:
- 从D中随机选择k个样本作为初始均值向量 { μ 1 , μ 2 . . . , μ k } \lbrace \mu_1,\mu_2...,\mu_k \rbrace {μ1,μ2...,μk},
- 令 C = ∅ C = \emptyset C=∅
- for j = 1,2, …, m(每个样本)
计算样本 x j x_j xj与各均值向量 μ i ( i ≤ i ≤ k ) \mu_i(i \le i \le k) μi(i≤i≤k)的距离: d i j = ∣ ∣ x j − μ i ∣ ∣ 2 2 d_{ij} = ||x_j - \mu_i||_2^2 dij=∣∣xj−μi∣∣22
根据距离最近的均值向量确定 x j x_j xj的簇标记
将样本 x j x_j xj划入对应簇
end- for i = 1,2,…,k(每个簇)
计算新的均值向量 μ i ′ \mu_i' μi′
if μ i ≠ μ i ′ \mu_i \ne \mu_i' μi=μi′ then
\quad 将当前均值更新为 μ i ′ \mu_i' μi′
else
\quad 保持当前均值
end- if 当前均值均未更新 then
\quad 输出簇划分C = { C 1 , C 2 , . . . , C k C_1,C_2,...,C_k C1,C2,...,Ck}
else
\quad 返回第2步
为避免运行时间过长,通常设置一个最小调整阈值或者最大运行次数,在保证精度的同时减少运行次数
迭代过程的效果如下图:
4.2 学习向量化
学习向量化(learning vector quantization,LVQ)也是一种原型聚类,其核心思想是通过找到一组原型向量来代表聚类的中心,与kmeans不同,LVQ参考了样本的标签(或者假设的标签)来辅助聚类, 使得相同标签的样本更加靠近。
聚类的伪代码如下:
在每一轮迭代中,算法随机选取一个训练样本,并计算与其最近的原型向量,如果与原型向量类别一致,原型向量
p
i
∗
p_i*
pi∗向样本
x
j
x_j
xj靠拢,
p
′
=
p
i
∗
+
η
⋅
(
x
j
−
p
i
∗
)
p' = p_i* +\eta \cdot(x_j - p_i*)
p′=pi∗+η⋅(xj−pi∗)
此时
p
′
p'
p′与
x
j
x_j
xj的距离为:
∣
∣
p
′
−
x
j
∣
∣
2
=
∣
∣
p
i
∗
+
η
⋅
(
x
j
−
p
i
∗
)
−
x
j
∣
∣
2
=
(
1
−
η
)
∣
∣
p
i
∗
−
x
j
∣
∣
2
\begin{aligned} ||p'-x_j||_2 &= ||p_i* +\eta \cdot(x_j - p_i*) - x_j ||_2\\ &= (1 - \eta)||p_i* -x_j||_2 \end{aligned}
∣∣p′−xj∣∣2=∣∣pi∗+η⋅(xj−pi∗)−xj∣∣2=(1−η)∣∣pi∗−xj∣∣2
令
η
∈
(
0
,
1
)
\eta \in (0,1)
η∈(0,1),那么更新后原型向量更接近
x
j
x_j
xj
类似的,如果标记不同,更新后原型向量更远离
x
j
x_j
xj
具体可以参考下例:
令9~21号样本的标签为
c
1
c_1
c1,其他为
c
2
c_2
c2,假定共分为q = 5个簇,目标为找到五个原型向量
p
1
,
p
2
.
p
3
,
p
4
,
p
5
p_1,p_2.p_3,p_4,p_5
p1,p2.p3,p4,p5,我们希望好瓜3个簇,坏瓜2个簇,初始化样本为
x
5
,
x
12
,
x
18
,
x
23
,
x
29
x_5,x_{12},x_{18},x_{23},x_{29}
x5,x12,x18,x23,x29,对应标记为
c
1
,
c
2
,
c
2
,
c
1
,
c
1
,
c_1,c_2,c_2,c_1,c_1,
c1,c2,c2,c1,c1,.
假定随机选取的样本为
x
1
x_1
x1,类别为
c
1
c_1
c1, 与p的距离如下
n
距离
标签
p
1
0.183
c
1
p
2
0.506
c
2
p
3
0.434
c
2
p
4
0.260
c
1
p
5
0.032
c
1
\begin{array}{c|lcr} n & \text{距离} & \text{标签} \\ \hline p_1 & 0.183 & c_1 &\\ p_2 & 0.506 & c_2& \\ p_3 & 0.434 & c_2&\\ p_4 & 0.260 & c_1\\ p_5 & 0.032 &c_1 \end{array}
np1p2p3p4p5距离0.1830.5060.4340.2600.032标签c1c2c2c1c1
x
1
x_1
x1与
p
5
p_5
p5的距离最近,且标签相同,假定学习率
η
=
0.1
\eta = 0.1
η=0.1,
p
5
p_5
p5更新得到
p
5
′
=
p
5
+
η
⋅
(
x
1
−
p
5
)
=
(
0.725
,
0.445
)
+
0.1
⋅
(
(
0.697
,
0.460
)
−
(
0.725
,
0.445
)
)
=
(
0.722
,
0.442
)
\begin{aligned} p_5' &= p_5 + \eta \cdot (x_1 - p_5) \\ &=(0.725,0.445) + 0.1\cdot ((0.697, 0.460) - (0.725,0.445))\\ &=(0.722,0.442) \end{aligned}
p5′=p5+η⋅(x1−p5)=(0.725,0.445)+0.1⋅((0.697,0.460)−(0.725,0.445))=(0.722,0.442)
继续选取下一样本进行相同操作,得到迭代的效果如下图:
5. 密度聚类
密度聚类假设样本簇能够通过样本的紧密程度来确定,从样本角度密度的角度考察样本间的可连续性,并基于可连接样本不断扩展聚类簇以获取最终聚类结果。
DBSCAN是著名的密度聚类算法,DBSCAN使用一组关于“邻域”概念的参数来描述样本分布的紧密程度,将具有足够密度的区域划分成簇,且能在有噪声的条件下发现任意形状的簇。
先用一个图来引入DBSCAN的定义的几个概念,
-
ϵ \epsilon ϵ邻域:对 x i ∈ D x_i \in D xi∈D,其 ϵ \epsilon ϵ邻域为在样本集D中,与 x i x_i xi距离不大于 ϵ \epsilon ϵ的样本,记为 N ϵ ( x i ) = { x j ∈ D ∣ d i s t ( x i , x j ) ≤ ϵ } N_\epsilon(x_i) =\lbrace x_j \in D | dist(x_i,x_j) \le \epsilon \rbrace Nϵ(xi)={xj∈D∣dist(xi,xj)≤ϵ},如上图, x 1 x_1 x1的 ϵ \epsilon ϵ邻域就包含5个样本
-
核心对象:若 x i x_i xi的 ϵ \epsilon ϵ邻域至少包含 M i n p t s Minpts Minpts个样本,即 ∣ ∣ N ϵ ( x i ) ∣ ∣ ≥ M i n p t s ||N_\epsilon(x_i) || \ge Minpts ∣∣Nϵ(xi)∣∣≥Minpts,则称 x i x_i xi是一个核心对象,如上图,如果 M i n p t s Minpts Minpts取4,那么 x 1 x_1 x1就是一个核心对象
-
密度直达: x j x_j xj在 x i x_i xi的 ϵ \epsilon ϵ邻域中,且 x i x_i xi是核心对象,就称 x j x_j xj由 x i x_i xi密度直达,如上图的 x 1 x_1 x1, x 2 x_2 x2
-
密度可达:对 x i x_i xi, x j x_j xj,若存在样本序列 p 1 , p 1 , . . . , p n p_1,p_1,...,p_n p1,p1,...,pn,其中, p 1 = x i , p n = x j p_1 = x_i,p_n = x_j p1=xi,pn=xj,且 p i + 1 p_{i+1} pi+1由 p i p_i pi密度直达,则称 x j x_j xj由 x i x_i xi密度k可达,如上图的 x 1 x_1 x1, x 3 x_3 x3
-
密度相连:对于 x i x_i xi, x j x_j xj,如果存在 x k x_k xk,使得 x i x_i xi, x j x_j xj均由 x k x_k xk密度可达,则称 x i x_i xi, x j x_j xj密度相连,如上图的 x 3 x_3 x3, x 4 x_4 x4
DBSCAN对簇的定义为:由密度可达关系导出的最大的密度相连的样本集合
步骤:一开始任意选择一个没有被标记的核心对象,找到它的所有密度可达对象,即一个簇,这些核心对象以及它们ε邻域内的点被标记为同一个类;然后再找一个未标记过的核心对象,重复上边的步骤,直到所有核心对象都被标记为止。
伪代码如下:
为了更好理解,我们看4.2节中西瓜的例子,聚类的过程如下:
- 先找出核心对象集合 { x 3 , x 5 , x 6 , x 8 , x 9 , . . . , x 29 } \lbrace x_3,x_5,x_6,x_8,x_9,...,x_{29}\rbrace {x3,x5,x6,x8,x9,...,x29}
- 随机选择一个作为种子,假定为 x 8 x_8 x8
- 则生成的簇为 C 1 = { x 6 , x 7 , x 8 , x 10 , x 12 , x 18 , x 19 , x 20 , x 23 } C_1 = \lbrace x_6,x_7,x_8,x_{10},x_{12},x_{18},x_{19},x_{20},x_{23}\rbrace C1={x6,x7,x8,x10,x12,x18,x19,x20,x23}
- 将 C 1 C_1 C1中包含的核心对象从核心对象集合中剔除
- 从对象集合中随机选择一个核心对象作为种子来生成下一个簇
- 重复上述过程,直到核心对象集合没有元素为止
聚类过程各阶段的结果如下:
6. 层次聚类
层次聚类试图在不同层次对数据进行划分,从而形成树形的聚类结构,可采用“自底向上”或“自顶向下”的策略。
AGNES是一种采用自底向上的层次聚类算法,它先将每个样本看做是一个簇,在运行的每一步中找出距离最近的两个簇进行合并,不断重复上述过程,直至达到预设的簇个数。距离可以选择最小距离、最远距离或者平均距离。
伪代码如下:
上面西瓜的例子聚类的过程用树状图可以表示如下图:
聚类的效果图如下:
7. 参考
周志华《机器学习》