K-means聚类算法
聚类是一种无监督学习方法。在无监督学习中,训练集只包含 { x ( 1 ) , x ( 2 ) , ⋯ , x ( n ) ; x ( i ) ∈ R d } \{x^{(1)},x^{(2)},\cdots,x^{(n)};x^{(i)}\in \mathbb{R^d}\} {x(1),x(2),⋯,x(n);x(i)∈Rd},每个训练样本没有对应的标签 y ( i ) y^{(i)} y(i)。 k -means k\text{-means} k-means是一种常用的聚类算法。 k -means k\text{-means} k-means首先随机地选择 k k k个簇中心,然后通过每个样本与所有簇中心的距离不断地更新 k k k个簇中心,直到算法收敛。整个算法的流程如下所示:
1.
Initialize
cluster
centroids
μ
1
,
μ
2
,
⋯
,
μ
k
∈
R
d
randomly
2.
Repeat until convergence: {
For every
i
, set
c
(
i
)
:
=
arg
min
j
∥
x
(
i
)
−
μ
j
∥
2
For each
j
, set
μ
j
:
=
∑
i
=
1
n
{
c
(
i
)
=
j
}
x
(
i
)
∑
i
=
1
n
{
c
(
i
)
=
j
}
}
\begin{aligned} 1.\ &\text{Initialize }\textbf{cluster centroids }\mu_1,\mu_2,\cdots,\mu_k\in \mathbb{R^d}\text{ randomly}\\ 2.\ &\text{Repeat until convergence: \{}\\ &\quad\quad\text{For every }i\text{, set}\\ &\quad\quad\quad\quad\quad\quad\quad\quad c^{(i)} := \arg\min_j \|x^{(i)}-\mu_j\|^2\\ &\quad\quad\text{For each } j\text{, set}\\ &\quad\quad\quad\quad\quad\quad\quad\quad\mu_j := \frac{\sum_{i=1}^{n}\{c^{(i)}=j\}x^{(i)}}{\sum_{i=1}^n\{c^{(i)} = j\}}\\ &\} \end{aligned}
1. 2. Initialize cluster centroids μ1,μ2,⋯,μk∈Rd randomlyRepeat until convergence: {For every i, setc(i):=argjmin∥x(i)−μj∥2For each j, setμj:=∑i=1n{c(i)=j}∑i=1n{c(i)=j}x(i)}
其中内循环重复执行两个步骤:将每个训练样本
x
(
i
)
x^{(i)}
x(i)“分配”到离他最近的簇中心
μ
j
\mu_j
μj,以及将每个簇中心
μ
j
\mu_j
μj移动到分配给它的所有样本的均值(即中心)。
收敛性
那么
k
-means
k\text{-means}
k-means算法是不是保证一定收敛呢?答案是肯定的。考虑如下失真函数:
J
(
c
,
μ
)
=
∑
i
=
1
n
∥
x
(
i
)
−
μ
c
(
i
)
∥
2
J(c,\mu)=\sum_{i=1}^n\|x^{(i)}-\mu_{c^{(i)}}\|^2
J(c,μ)=i=1∑n∥x(i)−μc(i)∥2
该函数衡量了每个训练样本
x
(
i
)
x^{(i)}
x(i)到分配给该样本的簇中心
μ
c
(
i
)
\mu_{c^{(i)}}
μc(i)的距离平方。可以看出,
k
-means
k\text{-means}
k-means算法恰好是
J
J
J的坐标下降。具体而言,
k
-means
k\text{-means}
k-means的内层循环在保持
μ
\mu
μ固定的同时,相对于
c
c
c反复最小化
J
J
J;然后在保持
c
c
c固定的同时,相对于
μ
\mu
μ最小化
J
J
J。 因此,
J
J
J必须是单调递减的,此时
J
J
J一定收敛。
然而,失真函数
J
(
c
,
μ
)
J(c,\mu)
J(c,μ)是一个非凸函数,因此
k
-means
k\text{-means}
k-means算法可能收敛到局部极小值。为了防止此类事件发生,我们可以多次运行
k
-means
k\text{-means}
k-means算法,然后选择失真函数值最小的那个。