- K-Means算法是无监督的聚类算法,存在有大量的变体。
K-Means
- 对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大。
- 假设簇划分为
(
C
1
,
C
2
,
.
.
.
C
k
)
(C_1,C_2,...C_k)
(C1,C2,...Ck),最小化平方误差E:
E
=
∑
i
=
1
k
∑
x
∈
C
i
∣
∣
x
−
μ
i
∣
∣
2
2
E = \sum\limits_{i=1}^k\sum\limits_{x \in C_i} ||x-\mu_i||_2^2
E=i=1∑kx∈Ci∑∣∣x−μi∣∣22其中
μ
i
\mu_i
μi是簇
C
i
C_i
Ci的均值向量,也称为质心:
μ
i
=
1
∣
C
i
∣
∑
x
∈
C
i
x
\mu_i = \frac{1}{|C_i|}\sum\limits_{x \in C_i}x
μi=∣Ci∣1x∈Ci∑x想直接求上式的最小值并不容易,这是一个NP难题,因此只能采用启发式的迭代方法。
传统K-Means算法流程
输入是样本集
D
=
{
x
1
,
x
2
,
.
.
.
x
m
}
D=\{x_1,x_2,...x_m\}
D={x1,x2,...xm},聚类的簇树k,最大迭代次数N
输出是簇划分
C
=
(
C
1
,
C
2
,
.
.
.
C
k
)
C = (C_1,C_2,...C_k)
C=(C1,C2,...Ck)
- 从数据集D中随机选择k个样本作为初始的k个质心向量 { μ 1 , μ 2 , . . . , μ k } \{\mu_1,\mu_2,...,\mu_k\} {μ1,μ2,...,μk} (k: 交叉验证,质心: 不宜太近)
- 对于n=1,2,…,N:
- 将簇划分C 初始化: C t C_t Ct = ∅, 𝑡=1,2…𝑘
- 对于i=1,2…m,计算样本 x i x_i xi和各个质心向量 μ t \mu_t μt (t=1,2,…𝑘)的距离: d i t = ∣ ∣ x i − μ t ∣ ∣ 2 2 d_{it} = ||x_i - \mu_t||_2^2 dit=∣∣xi−μt∣∣22,将 x i x_i xi标记为最小的 d i t d_{it} dit所对应的类别 λ t {\lambda_t} λt。此时更新 C t = C t ∪ { x i } C_{t} = C_{t} \cup \{x_i\} Ct=Ct∪{xi}
- 对于t=1,2,…,k,对 C t C_t Ct中所有的样本点重新计算新的质心 μ t = 1 ∣ C t ∣ ∑ x ∈ C t x \mu_t = \frac{1}{|C_t|}\sum\limits_{x \in C_t}x μt=∣Ct∣1x∈Ct∑x
- 如果所有的k个质心向量都没有发生变化,则跳出。
- 输出簇划分 C = ( C 1 , C 2 , . . . C k ) C = (C_1,C_2,...C_k) C=(C1,C2,...Ck)
K-Means距离计算优化elkan K-Means
- 在传统的K-Means算法中,每次迭代时,要计算所有的样本点到所有的质心的距离,这样会比较的耗时。
- elkan K-Means利用了两边之和大于等于第三边,以及两边之差小于第三边的三角形性质,来减少距离的计算。
- 对于一个样本点𝑥和两个质心
μ
t
1
,
μ
t
2
\mu_{t1},\mu_{t2}
μt1,μt2。预先计算出这两个质心之间的距离
D
(
t
1
,
t
2
)
D(t_1,t_2)
D(t1,t2)
- 如果 2 D ( x , t 1 ) ≤ D ( t 1 , t 2 ) 2D(x,t_1) \leq D(t_1,t_2) 2D(x,t1)≤D(t1,t2),则 D ( x , t 1 ) ≤ D ( x , t 2 ) D(x,t_1) \leq D(x,t_2) D(x,t1)≤D(x,t2)。
- D ( x , t 2 ) ≥ m a x { 0 , D ( x , t 1 ) − D ( t 1 , t 2 ) } D(x,t_2) \geq max\{0, D(x,t_1) - D(t_1,t_2)\} D(x,t2)≥max{0,D(x,t1)−D(t1,t2)}。
- 但如果样本的特征是稀疏的有缺失值,此时某些距离无法计算,则不能使用该算法。
大样本优化Mini Batch K-Means
- Mini Batch K-Means,选择一个合适批样本大小的batch size,仅仅用batch size个样本来做K-Means聚类。batch size一般通过无放回的随机采样得到的。
- 为了增加算法的准确性,一般会多跑几次Mini Batch K-Means算法,用得到不同的随机采样集来得到聚类簇,选择其中最优的聚类簇。
K-Means小结
主要优点
- 原理简单,实现容易,收敛速度快,算法的可解释度强,聚类效果较优。
主要缺点
- K值的选取不好把握
- 如果各隐含类别的数据不平衡,或者各隐含类别的方差不同,则聚类效果不佳。
- 采用迭代方法,得到的结果只是局部最优。
- 对噪音和异常点比较的敏感。