机器学习 - K-Means、K-Means++ 以及 ISOData
K-Means、K-Means++ 以及 ISOData 都是聚类算法,它们通过计算样本点到聚类中心的距离来进行类别划分。下面分别介绍这三种方法。
-
K-Means
“物以类聚,人以群分”,K-Means 算法就是降相似的样本划定为同一类别,而其中的 K 是指将数据聚成 K 类。
算法步骤:
- 从数据集构成的样本空间中随机选取 K 个聚类中心 C = { c 1 , c 2 , . . . , c k } C=\{c_1,c_2,...,c_k\} C={c1,c2,...,ck}
- 对每一个样本 x i x_i xi 计算其到 K 个聚类中心的距离,即每个样本 x i x_i xi 计算 K 个距离 D k , x i = { D c 1 , D c 2 , . . . , D c k ∣ x i } D_{k,x_i}=\{D_{c_1},D_{c_2},...,D_{c_k}|x_i\} Dk,xi={Dc1,Dc2,...,Dck∣xi},并将距离最近的中心所代表的类别设为 x i x_i xi 类别。
- 针对每个中心 c 1 , c 2 , . . . , c k c_1,c_2,...,c_k c1,c2,...,ck,分别计算各自从属它们的所有样本的中心: c j = 1 N c j ∑ x ∈ c j x i , j = 1 , 2 , . . . , k c_j=\frac{1}{N_{c_j}}\sum_{x∈c_j}x_i,j=1,2,...,k cj=Ncj1∑x∈cjxi,j=1,2,...,k
- 重复 2,3 步直到聚类中心不在变化,或变化小于某一阈值
对于 K-Means 算法,类别个数 K 的选取十分重要:
-
K 值越小,模型越欠拟合,偏差越大,对数据不能充分学习(一个簇类包含了一半的数据,效果应该不会太好)。
-
K 值越大,模型越容易过拟合,方差越大,对噪声敏感。(有可能将几个噪声点也划分出一个类别,这也是不好的)
(对偏差与方差的讲解可参照此文 机器学习 - KNN、偏差与方差)
对于 K 值,要与 KNN 中的 K 有所区分:
- KNN 中的 K 是指被分类样本类别的决策,受周围 K 个样本影响;
- K-Means 中的 K 是指最终样本要被划分成 K 个类别。
在 K-Means 算法中,第一步:初始聚类中心的选取也非常重要,K-Means 对初始聚类中心是敏感的,会影响到最终的聚类结果。
针对 K-Means 算法对于 K 值地选取以及初始聚类中心的选取两个薄弱点,可以适用 K-Means++ 与 ISOData 方法进行改进。
-
K-Means++
K-Means++ 的改进思想为:对于初始聚类中心,我们尽可能地让各聚类中心之间距离尽可能地远,也就是让聚类划分的类别之间区别尽量明显。
假设 K = 4 K=4 K=4
-
从数据集中随机选取 1 个样本最为第一个初始聚类中心 : c 1 = x r a n d o m c_1=x_{random} c1=xrandom
-
而后对每一个样本点计算其到所有 已有中心 的距离,并选取最小值设为此样本的 D ( x ) D(x) D(x)
-
计算每个样本被选为下一个聚类中心的概率 P ( x ) = D 2 ( x ) ∑ x ∈ X D 2 ( x ) P(x)=\frac{D^2(x)}{\sum_{x∈X} D^2(x)} P(x)=∑x∈XD2(x)D2(x),并计算所有样本按序号顺序排列后的累积概率 P s u m ( x i ) P_{sum}(x_i) Psum(xi),并以此生成累计概率分布。
例如, P ( x 1 ) = 0.3 , P ( x 2 ) = 0.4 , P ( x 3 ) = 0.3 P(x_1)=0.3,P(x_2)=0.4,P(x_3)=0.3 P(x1)=0.3,P(x2)=0.4,P(x3)=0.3,则 P s u m ( x 2 ) = 0.3 + 0.4 = 0.7 , P s u m ( x 3 ) = 0.7 + 0.3 = 0.8 P_{sum}(x_2)=0.3+0.4=0.7,P_{sum}(x_3)=0.7+0.3=0.8 Psum(x2)=0.3+0.4=0.7,Psum(x3)=0.7+0.3=0.8。
样本序号 x 1 x_1 x1 x 2 x_2 x2 x 3 x_3 x3 P ( x i ) P(x_i) P(xi) 0.3 0.4 0.3 P s u m ( x i ) P_{sum}(x_i) Psum(xi) 0.3 0.7 1 -
由 P s u m ( x i ) P_{sum}(x_i) Psum(xi) 可获得概率区间: [ 0 , 0.3 ) , [ 0.3 , 0.7 ) , [ 0.7 , 1 ] [0,0.3),[0.3,0.7),[0.7,1] [0,0.3),[0.3,0.7),[0.7,1]
-
从 [ 0 , 1 ] [0,1] [0,1] 中选出一个随机数 r r r, r r r 在哪个区间中,此区间对应的样本则成为一个聚类中心
-
重复 2,3,4,5 直到聚类中心个数等于 K K K
-
在确定好初始聚类中心后,按照一般 K-Means 的方法进行计算,直到迭代停止
-
-
ISOData
ISOData 算法可以对 K 值进行实时修改,
- 设定一个初始 K 值 K 0 K_0 K0
- 当一个类别中的样本少于一个阈值时就将此类别删去,K=K-1,并重新分配没有此类别下的样本
- 当类别个数 K < K 0 2 K<\frac{K_0}{2} K<2K0 时,说明此时类别太少,进行分裂操作
- 当类别个数 K > 2 K 0 K>2K_0 K>2K0 时,说明此时类别太多,进行合并操作
- 重复 2,3,4 直到迭代停止
对于详细分裂与合并操作可参考此文 分裂与合并
由以上步骤可以发现,虽然 ISOData 方法可以实时修改类别个数,但是仍然需要人为设置很多的阈值与参数,所以并不是非常受欢迎。
-
K-Means 与 KNN 比较
项目 KNN K-Means 分类聚类 分类算法 聚类算法 过程 直接计算 有训练过程 k 值的含义 受周围 k 个样本影响 要划分的类别个数 确定性 一旦 k 值确定,各样本类别即确定 每次迭代后类别可能改变 对于 K-Means 还可从 EM 角度进行解释,对此内容以后再做讲解。