聚类是一种非监督学习方法,而K均值聚类(K-Means Clustering)是最基础和最常用的聚类算法。它的基本思想是:通过迭代方式寻找K的簇(Cluster)的一种划分方案,使得聚类结果对应的代价函数最小。特别的,代价函数可以定义为各个样本点到距离其所属簇中心点的误差的平方和:
J ( c , μ ) = ∑ i = 1 M ∣ ∣ x i − μ c i ∣ ∣ 2 J(c,\mu) = \sum_{i=1}^M||x_i-\mu_{c_i}||^2 J(c,μ)=i=1∑M∣∣xi−μci∣∣2
其中 x i x_i xi代表第 i i i个样本, c i c_i ci是 x i x_i xi所属的簇, μ c i \mu_{c_i} μci代表簇对应的中心点, M M M是样本总数。
基本原理
K均值聚类的核心目标是将给定的数据集划分成 K K K个簇,并给每个数据对应的簇中心点。算法的具体步骤描述如下:
- 数据预处理,如归一化,离群点处理
- 随机选取K和簇中心,记为 μ 1 ( 0 ) , μ 2 ( 0 ) , μ k ( 0 ) \mu_1^{(0)},\mu_2^{(0)},\mu_k^{(0)} μ1(0),μ2(0),μk(0)
- 定义代价函数: J ( c , μ ) = min μ min c ∑ i = 1 M ∣ ∣ x i − μ i ∣ ∣ 2 J(c,\mu)=\min\limits_{\mu}\min\limits_{c}\sum_{i=1}^M||x_i-\mu_i||^2 J(c,μ)=μmincmin∑i=1M∣∣xi−μi∣∣2
- 令
t
=
0
,
1
,
2
,
.
.
.
,
t=0,1,2,...,
t=0,1,2,...,为迭代步数,重复以下过程直到
J
J
J收敛:
对于每一个样本 x i x_i xi,将其分配至距离最近的簇 c i ( t ) ← arg min k ∣ ∣ x i − μ k ( t ) ∣ ∣ 2 c_i^{(t)}\leftarrow \argmin\limits_{k}||x_i-\mu_k^{(t)}||^2 ci(t)←kargmin∣∣xi−μk(t)∣∣2
对于每一个类簇 k k k,重新计算该类簇的中心 μ ( t + 1 ) ← arg min μ ∑ i : c ( t ) = k ∣ ∣ x i − μ ∣ ∣ 2 \mu{(t+1)\leftarrow\argmin \limits_{\mu}}\sum_{i:c{(t)}=k}||x_i-\mu||^2 μ(t+1)←μargmin∑i:c(t)=k∣∣xi−μ∣∣2
K均值算法在迭代时,假设当前 J J J没有达到最小值,那么首先固定簇中心 { μ k } \{\mu_k\} {μk},调整每个样例 x i x_i xi所属的类别 c i c_i ci来让受损失函数 J J J减少,然后固定 { c i } \{c_i\} {ci},调整簇中心 { μ k } \{\mu_k\} {μk}使得 J J J减少。这两个过程交替循环, J J J单调递减;当 J J J递减到最小值时, { μ k } \{\mu_k\} {μk}和 { c k } \{c_k\} {ck}也同时收敛。
K均值算法的优缺点
K均值算法有一些缺点,例如:
- 受初值和离群点的影响每次结果不稳定
- 结果通常不是全局最优而是局部最优
- 无法很好的解决数据簇分布差别比较大的情况(比如一个类别的样本数量是另一个类别的100倍)
- 不太适用离散分类
但K均值算法也有一些优点:
- 对大数据集,K均值算法是scalable和efficient的,计算复杂度是O(NKt)接近于线性,其中 N N N是数据对象的数目, K K K是聚类的簇数, t t t是迭代的轮数。
- 尽管算法进场以局部最优结束,但一般情况下的局部最优已经可以满足聚类的需求。
K均值算法如何调优
- 数据归一化和离群点处理
K均值聚类本质上是一种基于欧式距离度量的数据划分方法,均值和方差大的维度将对数据的聚类结果产生决定性的影响,所以未做归一化和同一单位的数据是无法参与运算和比较的。同时,离群点或者少量的噪声数据将会对均值产生较大的影响,导致中心偏移,因此使用K均值聚类之前通常需要对数据进行预处理。 - 合理的选择K值
手肘法
Gap Statistic
Gap Statistic定义为:
G
a
p
(
K
)
=
E
(
l
o
g
D
k
)
−
l
o
g
D
k
Gap(K)=E(logD_k)-logD_k
Gap(K)=E(logDk)−logDk
其中 E ( l o g D k ) E(logD_k) E(logDk)是 l o g D k logD_k logDk的期望,一般通过蒙特·卡罗尔模拟产生。
- 采用核函数引入非线性
K均值算法有哪些改进型
K均值算法的主要缺点:
(1)需要人工预先确定初始
K
K
K值,且该值和真实的数据分布未必吻合。
(2)K均值只能收敛到局部最优,效果受初始值影响很大。
(3)易收到噪声点的影响。
(4)样本点只能被划分到单一的类中。
改进型基本也是朝着能减弱这些缺点的方向来做。
KMeasn++算法
原始K均值算法最开始随机选取数据集中 K K K个点作为聚类中心,而KMeans++算法按照如下的思想选取K和聚类中心:
假设已经选取了n个初始的聚类中心( 0 < n < k 0<n<k 0<n<k),则在选取第 n + 1 n+1 n+1个聚类中心时,距离当前 n n n个聚类中心越远的点会有更高的概率被选为第 n + 1 n+1 n+1个聚类中心。在初次迭代选取第一个聚类中心是( n = 1 n=1 n=1)仍然是随机选取的,这又符合我们的直觉,因为直观上讲聚类中心离得越远越好。其余过程和经典KMeans算法相同。
ISODATA
ISODATA全称迭代自组织数据分析法(Iterated Self Organization Data)。在KMeans算法中,聚类个数K往往实现由人为决定,计算过程中无法更改。而在海量高维数据的场景下,K的大小是难以估计的。ISODATA基于这个思想进行了改进:
- 当属于某个类别的样本过多、分散程度过大时,将该类别分为两个子类别
- 当属于某类别的样本过少时,将该类别去除。
ISODATA算法在K均值算法的基础之上增加了两个操作:
- 分裂操作,对应聚类中心的增加
- 合并操作,对应聚类中心的减少
该算法需要四个参数:
(1)预期的聚类中心数目
K
0
K_0
K0。在ISODATA算法运行过程中聚类中心数可以改变,
K
0
K_0
K0只是一个参考值,最终输出的聚类中心一般在
0.5
k
0
<
k
<
2
k
0
0.5k_0<k<2k_0
0.5k0<k<2k0之间。
(2)每个类所需要的最少样本数目
N
m
i
n
N_min
Nmin,如果分裂后将导致某个子类别的样本数目小于该阈值,则不会进行分裂操作。
(3)最大方差sigma。用于控制某个类别中样本的分散程度。当样本的分散程度大于这个阈值并且满足条件(2),则进行分裂。
(4)两个聚类中心之间允许的最小距离
D
m
i
n
D_{min}
Dmin,如果两个类之间的距离小于这个阈值,则对这两个类进行合并操作。