聚类方法是无监督学习方法,针对给定的样本,依据它们特征的相似度或距离,将其归并到若干个“类”或“簇”中。本次介绍两种最常用的聚类算法:层次聚类(hierarchical clustering)和 k k k均值聚类( k k k-means clustering)。
一、聚类的基本概念
聚类的核心概念是相似度(similarity)或距离(distance),下面是多种相似度或距离的定义。
如果将样本集合看作是向量空间中点的集合,以该空间的距离表示样本之间的相似度,常用的距离有闵可夫斯基距离(Minkowski distance)。针对样本
x
i
x_i
xi与样本
x
j
x_j
xj,它的定义为
d
i
j
=
(
∑
k
=
1
m
∣
x
k
i
−
x
k
j
∣
p
)
1
p
,
p
≥
1
d_{ij}=(\sum_{k=1}^m|x_{ki}-x_{kj}|^p)^{\frac{1}{p}}, p\ge1
dij=(k=1∑m∣xki−xkj∣p)p1, p≥1 当
p
=
2
p=2
p=2时,称为欧式距离(Euclidean distance),即
d
i
j
=
(
∑
k
=
1
m
∣
x
k
i
−
x
k
j
∣
2
)
1
2
d_{ij}=(\sum_{k=1}^m|x_{ki}-x_{kj}|^2)^{\frac{1}{2}}
dij=(k=1∑m∣xki−xkj∣2)21 当
p
=
1
p=1
p=1时,称为曼哈顿距离(Manhattan distance),即
d
i
j
=
∑
k
=
1
m
∣
x
k
i
−
x
k
j
∣
d_{ij}=\sum_{k=1}^m|x_{ki}-x_{kj}|
dij=k=1∑m∣xki−xkj∣ 当
p
=
∞
p=\infin
p=∞时,称为切比雪夫距离(Chebyshev distance),即
d
i
j
=
max
k
∣
x
k
i
−
x
k
j
∣
d_{ij}=\max_k|x_{ki}-x_{kj}|
dij=kmax∣xki−xkj∣ 除了闵可夫斯基距离之外,还有马哈拉诺比斯距离(Mahalanobis distance),简称马氏距离,它考虑了各个特征之间的相关性且它与各个特征的尺度无关。马氏距离的定义为
d
i
j
=
[
(
x
i
−
x
j
)
T
S
−
1
(
x
i
−
x
j
)
]
1
2
d_{ij}=[(x_i-x_j)^TS^{-1}(x_i-x_j)]^\frac{1}{2}
dij=[(xi−xj)TS−1(xi−xj)]21 其中
S
S
S是
X
=
(
x
i
j
)
m
×
n
X=(x_{ij})_{m\times n}
X=(xij)m×n的协方差矩阵,如果样本的各个特征互相独立且方差为1时,马氏距离就是欧式距离。
样本之间的相似度可以用相关系数(correlation coefficient)来表示,样本
x
i
x_i
xi与样本
x
j
x_j
xj之间的相关系数定义为
r
i
j
=
∑
k
=
1
m
(
x
k
i
−
x
ˉ
i
)
(
x
k
j
−
x
ˉ
j
)
[
∑
k
=
1
m
(
x
k
i
−
x
ˉ
i
)
2
∑
k
=
1
m
(
x
k
j
−
x
ˉ
j
)
2
]
1
2
r_{ij}=\frac{\sum_{k=1}^m(x_{ki}-\bar x_i)(x_{kj}-\bar x_j)}{[\sum_{k=1}^m(x_{ki}-\bar x_i)^2\sum_{k=1}^m(x_{kj}-\bar x_j)^2]^\frac{1}{2}}
rij=[∑k=1m(xki−xˉi)2∑k=1m(xkj−xˉj)2]21∑k=1m(xki−xˉi)(xkj−xˉj) 样本相似度也可以用夹角余弦(cosine)来表示
s
i
j
=
∑
k
=
1
m
x
k
i
x
k
j
[
∑
k
=
1
m
x
k
i
2
∑
k
=
1
m
x
k
j
2
]
1
2
s_{ij}=\frac{\sum_{k=1}^mx_{ki}x_{kj}}{[\sum_{k=1}^mx_{ki}^2\sum_{k=1}^mx_{kj}^2]^\frac{1}{2}}
sij=[∑k=1mxki2∑k=1mxkj2]21∑k=1mxkixkj 如果一个聚类方法假定一个样本只能属于一个类,或者类的交集为空集,那么该方法称为硬聚类(hard clustering)方法,否则称为软聚类(soft clustering)方法,本次介绍的都是硬聚类方法。
类的特征可以通过不同角度来刻画,常用特征有三种。首先是类的均值
x
ˉ
G
\bar x_G
xˉG,又称为类的中心
x
ˉ
G
=
1
n
G
∑
i
=
1
n
G
x
i
\bar x_G=\frac{1}{n_G}\sum_{i=1}^{n_G}x_i
xˉG=nG1i=1∑nGxi 类的直径(diameter)
D
G
D_G
DG
D
G
=
max
x
i
,
x
j
∈
G
d
i
j
D_G=\max_{x_i,x_j\in G}d_{ij}
DG=xi,xj∈Gmaxdij 样本协方差矩阵
S
G
S_G
SG
S
G
=
1
m
−
1
∑
i
=
1
n
G
(
x
i
−
x
ˉ
G
)
(
x
i
−
x
ˉ
G
)
T
S_G=\frac{1}{m-1}\sum_{i=1}^{n_G}(x_i-\bar x_G)(x_i-\bar x_G)^T
SG=m−11i=1∑nG(xi−xˉG)(xi−xˉG)T 类与类之间的距离也有下面四种定义。最短距离或单连接(single linkage),即类
G
p
G_p
Gp的样本与
G
q
G_q
Gq的样本之间的最短距离
D
p
q
=
min
{
d
i
j
∣
x
i
∈
G
p
,
x
j
∈
G
q
}
D_{pq}=\min\{d_{ij}|x_i\in G_p,x_j\in G_q\}
Dpq=min{dij∣xi∈Gp,xj∈Gq} 最长距离或完全连接(complete linkage),即类
G
p
G_p
Gp的样本与类
G
q
G_q
Gq的样本之间的最长距离
D
p
q
=
max
{
d
i
j
∣
x
i
∈
G
p
,
x
j
∈
G
q
}
D_{pq}=\max\{d_{ij}|x_i\in G_p,x_j\in G_q\}
Dpq=max{dij∣xi∈Gp,xj∈Gq} 中心距离,即类
G
p
G_p
Gp的中心
x
ˉ
p
\bar x_p
xˉp与类
G
q
G_q
Gq的中心
x
ˉ
q
\bar x_q
xˉq之间的距离
D
p
q
=
d
x
ˉ
p
x
ˉ
q
D_{pq}=d_{\bar x_p\bar x_q}
Dpq=dxˉpxˉq 平均距离,即类
G
p
G_p
Gp与类
G
q
G_q
Gq之间任意两个样本之间距离的平均值
D
p
q
=
1
n
p
n
q
∑
x
i
∈
G
p
∑
x
j
∈
G
q
d
i
j
D_{pq}=\frac{1}{n_pn_q}\sum_{x_i\in G_p}\sum_{x_j\in G_q}d_{ij}
Dpq=npnq1xi∈Gp∑xj∈Gq∑dij
二、层次聚类
层次聚类假设类别之间存在层次结构,层级聚类分为聚合(agglomerative)聚类和分裂(divisive)聚类两种方法,由于分裂聚类不太常用,这里仅介绍聚合聚类的方法。
首先将每个样本分到一个类,然后按照一定的规则(例如类间距离最小),将满足规则的两个类进行合并,如此反复进行直到满足停止条件(类的个数下降到阈值,或类的直径超过阈值)。
由于每一次迭代都要计算每个类之间的距离,因此每一次迭代可记作
O
(
n
2
)
O(n^2)
O(n2)的复杂度,如果停止条件是类的个数为1,即迭代
n
n
n次,那么聚合层次聚类算法的时间复杂度应为
O
(
n
3
)
O(n^3)
O(n3)。
《统计学习方法》中讲的时间复杂度是
O
(
n
3
m
)
O(n^3m)
O(n3m),
m
m
m是样本的维数,这应该是考虑了样本距离的计算过程,但样本距离不是每次迭代都要计算一遍的,只需要在第一次迭代之前计算出样本距离矩阵即可,所以我依然认为聚合聚类的时间复杂度是
O
(
n
3
)
O(n^3)
O(n3),如果我的理解有误,欢迎告知。
三、 k k k均值聚类
k
k
k均值聚类的策略是通过损失函数的最小化选取最优的划分
C
∗
C^*
C∗,在采用欧式距离作为样本距离的情况下,
k
k
k均值聚类就是求解下面的最优化问题
C
∗
=
arg
min
C
∑
l
=
1
k
∑
C
(
i
)
=
l
∣
∣
x
i
−
x
ˉ
l
∣
∣
2
C^*=\arg\min_C\sum_{l=1}^k\sum_{C(i)=l}||x_i-\bar x_l||^2
C∗=argCminl=1∑kC(i)=l∑∣∣xi−xˉl∣∣2 这个最优解的求解问题是NP困难问题,因此采用迭代的方法(本质是EM算法)求解。首先选择
k
k
k个类的中心,对于给定的中心值
(
m
1
,
m
2
,
⋯
 
,
m
k
)
(m_1,m_2,\cdots,m_k)
(m1,m2,⋯,mk),求一个划分
C
C
C使得目标函数极小化
min
C
∑
l
=
1
k
∑
C
(
i
)
=
l
∣
∣
x
i
−
m
l
∣
∣
2
\min_C\sum_{l=1}^k\sum_{C(i)=l}||x_i-m_l||^2
Cminl=1∑kC(i)=l∑∣∣xi−ml∣∣2 第二步,对给定的划分
C
C
C,求各个类的中心
(
m
1
,
m
2
,
⋯
 
,
m
k
)
(m_1,m_2,\cdots,m_k)
(m1,m2,⋯,mk),使得目标函数极小化
min
m
1
,
⋯
 
,
m
k
∑
l
=
1
k
∑
C
(
i
)
=
l
∣
∣
x
i
−
m
l
∣
∣
2
\min_{m_1,\cdots,m_k}\sum_{l=1}^k\sum_{C(i)=l}||x_i-m_l||^2
m1,⋯,mkminl=1∑kC(i)=l∑∣∣xi−ml∣∣2 可以证明,使上面的目标函数极小化的
(
m
1
,
m
2
,
⋯
 
,
m
k
)
(m_1,m_2,\cdots,m_k)
(m1,m2,⋯,mk)就是各个类别的样本均值,这样,第二步就转化为了更新各类别的样本均值。对于包含
n
l
n_l
nl个样本的类
G
l
G_l
Gl而言,更新其均值
m
l
m_l
ml
m
l
=
1
n
l
∑
C
(
i
)
=
l
x
i
,
l
=
1
,
⋯
 
,
k
m_l=\frac{1}{n_l}\sum_{C(i)=l}x_i, l=1,\cdots,k
ml=nl1C(i)=l∑xi, l=1,⋯,k 重复以上两个步骤,直到划分不再改变。
k
k
k均值聚类算法的每次迭代都要计算
n
n
n个样本与
k
k
k个类中心的距离,因此时间复杂度为
O
(
m
n
k
)
O(mnk)
O(mnk)。
k
k
k均值算法的迭代本质上是EM算法,属于启发式方法,不能保证得到全局最优,且初始中心的选择会直接影响聚类结果。类别数
k
k
k值需要预先指定,由于聚类结果的质量可以用类的平均直径来衡量,一般类别数变大时,平均直径会减小,但超过某个值以后,平均直径会不变,这个值正是最优的
k
k
k值。因为平均直径是有序的,所以可以采用二分查找快速找到最优的
k
k
k值。