本文为《机器学习》(周志华)、《统计学习方法》 的读书笔记
- 参考 南瓜书
目录
聚类任务
unsupervised learning
- 聚类试图将数据集中的无标记样本划分为若干个通常是不相交的子集,每个子集称为一个 “簇" (cluster). 通过这样的划分,每个簇可能对应于一些潜在的概念(类别)
- 聚类既能作为一个单独过程,用于找寻数据内在的分布结构,也可作为分类等其他学习任务的前驱过程. 例如,在一些商业应用中需对新用户的类型进行判别,但定义”用户类型” 对商家来说却可能不太容易,此时往往可先对用户数据进行聚类,根据聚类结果将每个簇定义为一个类,然后再基于这些类训练分类模型用于判别新用户的类型
- 如果一个聚类方法假定一个样本只能属于一个类,那么该方法称为硬聚类 (hard clustering) 方法。否则,如果一个样本可以属于多个类,或类的交集不为空集,那么该方法称为软聚类 (soft clustering) 方法
簇标记向量
- 假定样本集 D = { x 1 , x 2 , . . . , x m } D = \{x_1,x_2, ... ,x_m\} D={x1,x2,...,xm} 包含 m m m 个无标记样本,每个样本 x i x_i xi 都是一个 n n n 维特征向量,则聚类算法将样本集 D D D 划分为 k k k 个不相交的簇,则可以用 λ j ∈ { 1 , 2 , . . . , k } \lambda_j\in \{1, 2, ... , k\} λj∈{1,2,...,k} 表示样本 x j x_j xj 的 “簇标记" (cluster label). 于是,聚类的结果可用包含 m m m 个元素的簇标记向量 λ = ( λ 1 ; . . . ; λ m ) \lambda=(\lambda_1;...;\lambda_m) λ=(λ1;...;λm) 表示
聚类的基本概念
- 相似度 / 距离计算 (闵氏距离、马氏距离、相关系数、夹角余弦)
- 类或簇的定义: 下面的定义中,第一个定义最常用,并且由它可推出其他三个定义
- 类的均值 / 类的中心
x
ˉ
G
\bar x_G
xˉG
- 类的直径
D
G
D_G
DG
- 类的样本散布矩阵 (scatter matrix)
A
G
A_G
AG 与样本协方差矩阵 (covariance
matrix) S G S_G SG
其中 m m m 为样本的维数 (样本属性的个数)
- 类与类之间的距离 / 连接 (linkage): 设类
G
p
G_p
Gp 包含
n
p
n_p
np 个样本,
G
q
G_q
Gq 包含
n
q
n_q
nq 个样本,分别用
x
ˉ
p
\bar x_p
xˉp 和
x
ˉ
q
\bar x_q
xˉq 表示
G
p
G_p
Gp 和
G
q
G_q
Gq 的均值,即类的中心
- (1) 最短距离或单连接 (single linkage)
- (2) 最长距离或完全连接 (complete linkage)
- (3) 中心距离
- (4) 平均距离
- (1) 最短距离或单连接 (single linkage)
性能度量 / 聚类有效性指标 (validity index)
- 直观上看,我们希望 “物以类聚” ,即同一簇的样本尽可能彼此相似, 不同簇的样本尽可能不同. 换言之,聚类结果的 “簇内相似度” (intra-cluster similarity) 高且 “簇间相似度" (inter-cluster similarity) 低
- 聚类性能度量大致有两类:
- 一类是将聚类结果与某个 “参考模型" (reference model) 进行比较,称为 “外部指标" (external index)
- 例如将领域专家给出的划分结果作为参考模型
- 由于聚类属于无监督学习,事先并不知道聚类后样本所属类别的类别标记所代表的意义,即便参考模型的类别标记意义是已知的,我们也无法知道聚类后的类别标记与参考模型的类别标记是如何对应的,并且聚类后的类别总数与参考模型的类别总数还可能不一样. 下面会介绍一些外部指标来进行衡量
- 另一类是直接考察聚类结果而不利用任何参考模型,称为 “内部指标" (internal index).
- 一类是将聚类结果与某个 “参考模型" (reference model) 进行比较,称为 “外部指标" (external index)
外部指标
- 对数据集
D
=
{
x
1
,
x
2
,
.
.
.
,
x
m
}
D= \{x_1,x_2, ...,x_m\}
D={x1,x2,...,xm}, 假定通过聚类给出的簇划分为
C
=
{
C
1
,
.
.
.
,
C
k
}
C= \{C_1,...,C_k\}
C={C1,...,Ck},参考模型给出的簇划分为
C
∗
=
{
C
1
∗
,
.
.
.
,
C
s
∗
}
C^*= \{C_1^*,... ,C_s^*\}
C∗={C1∗,...,Cs∗}. 相应地,令
λ
\lambda
λ 与
λ
∗
\lambda^*
λ∗ 分别表示与
C
C
C 和
C
∗
C^*
C∗ 对应的簇标记向量.我们将样本两两配对考虑,定义
a + b + c + d = m ( m − 1 ) / 2 a+ b + c + d = m(m- 1)/2 a+b+c+d=m(m−1)/2
- 下面的几种外部指标值均 ∈ [ 0 , 1 ] \in[0,1] ∈[0,1],且越大越好
Jaccard 系数 (Jaccard Coefficient, JC)
- 给定两个集合
A
A
A 和
B
B
B,则 Jaccard 系数定义为如下公式
Jaccard 系数可以用来描述两个集合的相似程度
- 现在假设集合
A
A
A 中存放着两个样本都同属于聚类结果的同一个类的样本对,即
A
=
S
S
∪
S
D
A = SS\cup SD
A=SS∪SD,集合
B
B
B 中存放着两个样本都同属于参考模型的同一个类的样本对,即
B
=
S
S
∪
D
S
B = SS\cup DS
B=SS∪DS,那么根据 Jaccard 系数的定义有:
FM 指数 (Fowlkes and Mallows Index, FMI)
- 其中 a a + b , a a + c \frac{a}{a+b},\frac{a}{a+c} a+ba,a+ca 为 Wallace 提出的两个非对称指标, a a a 代表两个样本在聚类结果和参考模型中均属于同一类的样本对的个数, a + b a + b a+b 代表两个样本在聚类结果中属于同一类的样本对的个数, a + c a + c a+c 代表两个样本在参考模型中属于同一类的样本对的个数,这两个非对称指标均可理解为样本对中的两个样本在聚类结果和参考模型中均属于同一类的概率。由于指标的非对称性,这两个概率值往往不一样,因此 Fowlkes 和 Mallows 提出利用几何平均数将这两个非对称指标转化为一个对称指标,即 Fowlkes and Mallows Index, FMI
Rand 指数 (Rand Index, RI)
内部指标
- 考虑聚类结果的簇划分
C
=
{
C
1
,
.
.
.
,
C
k
}
C=\{C_1,...,C_k\}
C={C1,...,Ck},定义
其中, d i s t ( ⋅ , ⋅ ) dist(·,·) dist(⋅,⋅) 用于计算两个样本之间的距离, μ = 1 ∣ C ∣ ∑ 1 ≤ i ≤ ∣ C ∣ x i \boldsymbol μ=\frac{1}{|C|}\sum_{1\leq i\leq|C|}\boldsymbol x_i μ=∣C∣1∑1≤i≤∣C∣xi 代表簇 C C C 的中心点
- 显然 a v g ( C ) avg(C) avg(C) 对应于簇 C C C 内样本间的平均距离, d i a m ( C ) diam(C) diam(C) 对应于簇 C C C 内样本间的最远距离, d m i n ( C i , C j ) d_{min}(C_i,C_j) dmin(Ci,Cj) 对应于簇 C i C_i Ci 与簇 C j C_j Cj 最近样本间的距离, d c e n ( C i , C j ) d_{cen}(C_i,C_j) dcen(Ci,Cj) 对应于簇 C i C_i Ci 与簇 C j C_j Cj 中心点间的距离
DB 指数 (Davies-Bouldin Index, DBI)
- DBI 的值越小越好 → \rightarrow → “簇内相似度” 高且 “簇间相似度" 低
Dunn 指数 (Dunn Index, DI)
- DI 的值越大越好 → \rightarrow → “簇间相似度" 低
原型聚类 (prototype-based clustering)
- "原型"是指样本空间中具有代表性的点. 此类算法假设聚类结构能通过一组原型刻画.
- 通常情形下,算法先对原型进行初始化,然后对原型进行迭代更新求解.采用不同的原型表示、不同的求解方式将产生不同的算法
k k k 均值算法 ( k k k-means clustering)
最小化平方误差
- 给定样本集
D
=
{
x
1
,
.
.
,
x
m
}
D=\{\boldsymbol x_1,.. ,\boldsymbol x_m\}
D={x1,..,xm}, "
k
k
k 均值" (k-means) 算法针对聚类所得簇划分
C
=
{
C
1
,
C
2
,
.
.
.
,
C
k
}
\mathcal C = \{C_1,C_2, ... ,C_k\}
C={C1,C2,...,Ck} 最小化平方误差
- μ i = 1 ∣ C i ∣ ∑ x ∈ C i x \boldsymbol μ_i=\frac{1}{|C_i|}\sum_{\boldsymbol x\in C_i}\boldsymbol x μi=∣Ci∣1∑x∈Cix 代表簇 C i C_i Ci 的中心点
- 直观来看,式 (9.24) 在一定程度上刻画了簇内样本围绕簇均值向量的紧密程度, E E E 值越小则簇内样本相似度越高。但最小化式 (9.24) 并不容易,找到它的最优解需考察样本集 D D D 所有可能的簇划分,这是一个 NP 难问题
贪心策略
-
k
k
k 均值算法采用了贪心策略,通过迭代优化来近似求解式 (9.24)
- (1) 对给定的中心值
(
μ
1
,
.
.
.
,
μ
k
)
(\mu_1,...,\mu_k)
(μ1,...,μk),求一个划分
C
\mathcal C
C,使得目标函数极小化:
min C ∑ i = 1 k ∑ x ∈ C i ∣ ∣ x i − μ i ∣ ∣ 2 \min_{\mathcal C}\sum_{i=1}^k\sum_{x\in C_i}||x_i-\mu_i||^2 Cmini=1∑kx∈Ci∑∣∣xi−μi∣∣2就是说在类中心确定的情况下,将每个样本分到一个类中,使样本和其所属类的中心之间的距离总和最小。求解结果,将每个样本指派到与其最近的中心 μ i \mu_i μi 的类 C i C_i Ci 中 - (2) 对给定的划分
C
\mathcal C
C,再求各个类的中心
(
μ
1
,
.
.
.
,
μ
k
)
(\mu_1,..., \mu_k)
(μ1,...,μk),使得目标函数极小化:
min μ 1 , . . . , μ k ∑ i = 1 k ∑ x ∈ C i ∣ ∣ x i − μ i ∣ ∣ 2 \min_{\mu_1,..., \mu_k}\sum_{i=1}^k\sum_{x\in C_i}||x_i-\mu_i||^2 μ1,...,μkmini=1∑kx∈Ci∑∣∣xi−μi∣∣2就是说在划分确定的情况下,使样本和其所属类的中心之间的距离总和最小。求解结果,新的类中心为该类样本的均值
- (1) 对给定的中心值
(
μ
1
,
.
.
.
,
μ
k
)
(\mu_1,...,\mu_k)
(μ1,...,μk),求一个划分
C
\mathcal C
C,使得目标函数极小化:
为避免运行时间过长,通常设置一个最大运行轮数或最小调整幅度,若达到最大轮数或调整幅度小于阈值,则停止运行
算法特性
- 收敛性: k k k 均值聚类属于启发式方法,收敛速度快,但不能保证收敛到全局最优,初始中心的选择会直接影响聚类结果
- 初始类的选择: 可以用层次聚类对样本进行聚类,得到 k k k 个类时停止。然后从每个类中选取一个与中心距离最近的点作为初始类中心
- 类别数
k
k
k 的选择: 聚类结果的质量可以用类的平均直径来衡量。一般地,类别数变小时,平均直径会增加; 类别数变大超过某个值以后,平均直径会不变; 而这个值正是最优的
k
k
k 值。实验时,可以来用二分查找,快速找到最优的
k
k
k 值
- 缺点:对于非凸数据集比较难收敛;对非平衡数据或者簇方差不同的数据效果不佳;聚类结果只是局部最优 (严格凸数据可以全局最优);对噪音和异常点比较的敏感;算法复杂度与数据规模和数据维度成正比 (解决方案: 抽样 / Mini Batch K-Means)
提高算法效率: elkan K-Means
- 利用了两边之和大于等于第三边,以及两边之差小于第三边的三角形性质,来减少距离的计算
- (1) 对于一个样本点 x x x 和两个质心 μ j 1 \mu_{j_1} μj1 和 μ j 2 \mu_{j_2} μj2 ,预先计算出这两个质心之间的距离 D ( j 1 , j 2 ) D(j_1,j_2) D(j1,j2)。如果 2 D ( x , j 1 ) ≤ D ( j 1 , j 2 ) 2D(x,j_1)\leq D(j_1,j_2) 2D(x,j1)≤D(j1,j2),则 D ( x , j 1 ) ≤ D ( x , j 2 ) D(x,j_1)\leq D(x,j_2) D(x,j1)≤D(x,j2),无需再计算 D ( x , j 2 ) D(x,j_2) D(x,j2)
- (2) D ( x , j 2 ) ≥ max { 0 , D ( x , j 1 ) − D ( j 1 , j 2 ) } D(x,j_2)\geq\max\{0,D(x,j_1)-D(j_1,j_2)\} D(x,j2)≥max{0,D(x,j1)−D(j1,j2)} (这可以计算出距离的下界)
学习向量量化 (Learning Vector Quantization,LVQ)
- “学习向量量化” 也是试图找到一组原型向量来刻画聚类结构, 但与一般聚类算法不同的是, LVQ 假设数据样本带有类别标记,学习过程利用样本的这些监督信息来辅助聚类.
- 可看作通过聚类来形成类别"子类"结构,每个子类对应一个聚类簇
- 给定样本集
D
=
{
(
x
1
,
y
1
)
,
.
.
.
,
(
x
m
,
y
m
)
}
D = \{(\boldsymbol x_1,y_1), ...,(\boldsymbol x_m,y_m)\}
D={(x1,y1),...,(xm,ym)}, 每个样本
x
j
\boldsymbol x_j
xj 是由
n
n
n 个属性描述的特征向量
(
x
j
1
;
.
.
.
;
x
j
n
)
(x_{j1}; ...;x_{jn})
(xj1;...;xjn),
y
j
∈
Y
y_j\in\mathcal Y
yj∈Y 是样本
x
j
\boldsymbol x_j
xj 的类别标记. LVQ 的目标是学得一组
n
n
n 维原型向量
{
p
1
,
.
.
.
,
p
q
}
\{\boldsymbol p_1,...,\boldsymbol p_q\}
{p1,...,pq} (划分
q
q
q 个簇),每个原型向量代表一个聚类簇,簇标记
t
i
∈
Y
t_i\in \mathcal Y
ti∈Y. (这里的簇标记就代表新划分出来的簇代表的是哪一个类别的子类)
- (1) 先初始化原型向量
- 例如对第 q q q 个簇可从类别标记为 t q t_q tq 的样本中随机选取一个作为原型向量
- (2) 对原型向量进行迭代优化, 直至满足停止条件 (例如己达到最大迭代轮数,或原型向量更新很小甚至不再更新). 在每一轮选代中,算法随机选取一个有标记训练样本
x
j
\boldsymbol x_j
xj,找出与其距离最近的原型向量
p
i
∗
\boldsymbol p_{i^*}
pi∗,并根据两者的类别标记是否一致来对原型向量进行相应的更新.
- 直观上看,对样本
x
j
\boldsymbol x_j
xj,若最近的原型向量
p
i
∗
\boldsymbol p_{i^*}
pi∗ 与
x
j
\boldsymbol x_j
xj 的类别标记相同,则令
p
i
∗
\boldsymbol p_{i^*}
pi∗ 向
x
j
\boldsymbol x_j
xj 的方向靠拢 (试图将
x
j
\boldsymbol x_j
xj 划分到该原型向量表示的子类中),此时新原型向量为
p ′ = p i ∗ + η ⋅ ( x j − p i ∗ ) , ( 9.25 ) \boldsymbol{p}^{\prime}=\boldsymbol{p}_{i^{*}}+\eta \cdot\left(\boldsymbol{x}_{j}-\boldsymbol{p}_{i^{*}}\right),\ \ \ \ \ \ \ (9.25) p′=pi∗+η⋅(xj−pi∗), (9.25)其中学习率 η ∈ ( 0 , 1 ) η\in(0 ,1) η∈(0,1) - 若
p
i
∗
\boldsymbol p_{i^*}
pi∗ 与
x
j
\boldsymbol x_j
xj 的类别标记不同,则令
p
i
∗
\boldsymbol p_{i^*}
pi∗ 远离
x
j
\boldsymbol x_j
xj,此时新原型向量为
p ′ = p i ∗ − η ⋅ ( x j − p i ∗ ) \boldsymbol{p}^{\prime}=\boldsymbol{p}_{i^{*}}-\eta \cdot\left(\boldsymbol{x}_{j}-\boldsymbol{p}_{i^{*}}\right) p′=pi∗−η⋅(xj−pi∗)
- 直观上看,对样本
x
j
\boldsymbol x_j
xj,若最近的原型向量
p
i
∗
\boldsymbol p_{i^*}
pi∗ 与
x
j
\boldsymbol x_j
xj 的类别标记相同,则令
p
i
∗
\boldsymbol p_{i^*}
pi∗ 向
x
j
\boldsymbol x_j
xj 的方向靠拢 (试图将
x
j
\boldsymbol x_j
xj 划分到该原型向量表示的子类中),此时新原型向量为
- (3) 在学得一组原型向量
{
p
1
,
.
.
.
,
p
q
}
\{\boldsymbol p_1,...,\boldsymbol p_q\}
{p1,...,pq} 后,对任意样本
x
\boldsymbol x
x,它将被划入与其距离最近的原型向量所代表的簇中 (vector quatization); 由此形成了对样本空间
X
\mathcal X
X 的簇划分
{
R
1
,
…
,
R
q
}
\{R_1,… , R_q\}
{R1,…,Rq},该划分通常称为 “Voronoi 剖分” (Voronoi tessellation)
- (1) 先初始化原型向量
例
- 在西瓜数据集中,假定
q
=
5
q = 5
q=5,即学习目标是找到 5 个原型向量,并假定其对应的类别标记分别为
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. 即希望为 “好瓜” 找到 3 个簇, “坏瓜” 找到 2 个簇
高斯混合聚类 (Mixture-of-Gaussian)
- 与 k k k 均值、LVQ 用原型向量来刻画聚类结构不同,高斯混合聚类采用概率模型来表达聚类原型
- to be continued…
密度聚类 (density-based clustering)
- 此类算法假设聚类结构能通过样本分布的紧密程度确定. 通常情形下,密度聚类算法从样本密度的角度来考察样本之间的可连接性,并基于可连接样本不断扩展聚类簇以获得最终的聚类结果.
DBSCAN
“Density-Based Spatial Clustering of Applications with Noise”
- DBSCAN 是一种著名的密度聚类算法. 它基于一组 “邻域” (neighborhood) 参数
(
ϵ
,
M
i
n
P
t
s
)
(\epsilon, MinPts)
(ϵ,MinPts) 来刻画样本分布的紧密程度. 给定数据集
D
=
{
x
1
,
.
.
.
,
x
m
}
D = \{\boldsymbol x_1,...,\boldsymbol x_m\}
D={x1,...,xm}, 定义下面这几个概念:
- ϵ \epsilon ϵ-邻域: 对 x j ∈ D \boldsymbol x_j\in D xj∈D,其 ϵ \epsilon ϵ-邻域 N ϵ ( x j ) N_\epsilon(\boldsymbol x_j) Nϵ(xj) 包含样本集 D D D 中与 x j \boldsymbol x_j xj 的距离不大于 ϵ \epsilon ϵ 的样本
- 核心对象 (core object): 若 x j \boldsymbol x_j xj 的 ϵ \epsilon ϵ-邻域至少包含 M i n P t s MinPts MinPts 个样本,则 x j \boldsymbol x_j xj 是一个核心对象
- 密度直达 (directly density-reachable): 若 x j \boldsymbol x_j xj 位于 x i \boldsymbol x_i xi 的 ϵ \epsilon ϵ-邻域中,且 x i \boldsymbol x_i xi 是核心对象,则称 x j \boldsymbol x_j xj 由 x i \boldsymbol x_i xi 密度直达;
- 密度可达 (density-reachable): 对 x i \boldsymbol x_i xi 与 x j \boldsymbol x_j xj,若存在样本序列 p 1 , . . . , p n \boldsymbol p_1,...,\boldsymbol p_n p1,...,pn, 其中 p 1 = x i , p n = x j \boldsymbol p_1 =\boldsymbol x_i,\boldsymbol p_n =\boldsymbol x_j p1=xi,pn=xj 且 p i + 1 \boldsymbol p_{i+1} pi+1 由 p i \boldsymbol p_i pi 密度直达,则称 x j \boldsymbol x_j xj 由 x i \boldsymbol x_i xi 密度可达
- 密度相连 (density-connected): 对
x
i
\boldsymbol x_i
xi 与
x
j
\boldsymbol x_j
xj, 若存在
x
k
\boldsymbol x_k
xk 使得
x
i
\boldsymbol x_i
xi 与
x
j
\boldsymbol x_j
xj 均由
x
k
\boldsymbol x_k
xk 密度可达则称
x
i
\boldsymbol x_i
xi 与
x
j
\boldsymbol x_j
xj 密度相连
- 基于这些概念,DBSCAN 将 “簇” 定义为:由密度可达关系导出的最大的密度相连样本集合. 形式化地说,给定邻域参数
(
ϵ
,
M
i
n
P
t
s
)
(\epsilon,MinPts)
(ϵ,MinPts), 簇
C
⊂
D
C\subset D
C⊂D 是满足以下性质的非空样本子集:
- 实际上,不难证明,若 x \boldsymbol x x 为核心对象,由 x \boldsymbol x x 密度可达的所有样本组成的集合即为满足连接性与最大性的簇
D D D 中不属于任何簇的样本被认为是噪声 (noise)或异常(anomaly)样本
算法
- (1) 根据给定的邻域参数 ( ϵ , M i n P t s ) (\epsilon,MinPts) (ϵ,MinPts) 找出所有核心对象
- (2) 以任一核心对象为出发点 (“种子" (seed)),找出由其密度可达的样本生成聚类簇,直到所有核心对象均被访问过为止
层次聚类 (hierarchical clustering)
- 层次聚类试图在不同层次对数据集进行划分,从而形成树形的聚类结构. 数据集的划分可采用 “自底向上” 的聚合策略,也可采用 “自顶向下” 的分拆策略
- 聚合聚类开始将每个样本各自分到一个类,之后将相距最近的两类合并,建立一个新的类,重复此操作直到满足停止条件:得到层次化的类别
- 分裂聚类开始将所有样本分到一个类:之后将己有类中相距最远的样本分到两个新的类,重复此操作直到满足停止条件
- 由此可知,层次聚类需要预先确定下面三个要素:
- (1) 距离或相似度: 闵可夫斯基距离、马哈拉诺比斯距离、相关系数、夹角余弦
- (2) 合并规则: 类间距离最小,类间距离可以是最短距离、最长距离、中心距离、平均距离、豪斯多夫距离 (Hausdorff distance)
- (3) 停止条件: 类的个数达到阈值、类的直径超过阈值
下面给出聚合聚类的算法