K-Means聚类算法原理

  K-Means算法是无监督聚类算法,它有很多变体。包括初始化优化K-Means++,距离计算优化elkan K-Means算法和大样本优化Mini Batch K-Means算法。

1. K-Means原理

  K-Means算法思想:按照样本之间距离大小,将样本划分为K个簇。让簇内点尽量连在一起,簇间的距离尽量的大

  (KNN算法思想:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多属于一个类别,则该样本也属于这个类别。)

  用数据表达式表示,簇划分为(C1,C2,...Ck),目标是最小化平方误差E:

  其中μi是簇Ci的均值向量,有时也是质心,表达式:

  直接求上式最小值,不容易,是NP难题,只能采用启发式的迭代算法。

  K-Means采用的启发式方式很简单,用下图可形象描述:

  

  上图a初始数据集,假设 k=2。图b中,随机选择2个类别质心,即图中的红色质心和蓝色质心,然后求样本中所有点到这两个质心的距离,并标记每个样本的类别为距离最小的质心的类别,如图c,这样得到第一轮迭代后的类别。此时,对当前标记的红色和蓝色点分别求新的质心,如图d,图e和图f重复图c和图d的过程。即将所有点的类别标记为距离最近的质心的类别并求新的质心。

2. 传统K-Means算法流程

注意事项:

(1)、k 值的选择,一般根据经验选择一个合适 k 值,没有经验,通过交叉验证选择。

(2)、k 个质心的选择,质心的初始位置对最后的聚类结果和运行有很大影响。

算法流程:

输入:样本集D = {x1,x2,...xm},聚类的簇数k,最大迭代次数N

输出:簇划分C = {C1,C2,...Ck}

(1)、从数据集D中随机选择K个样本作为初始的k个质心向量:{μ1,μ2,...μk}

(2)、对n = 1,2,...N

  a、将簇划分C初始化为Ct = Ø (t = 1,2...k)

  b、对于 i = 1,2,...m,计算样本 xi 和各个质心向量 μj (j = 1,2...k) 的距离:,将 xi 标记为 dij 最小所对应的类别 λi 。此时更新

  c、对于 j = 1,2,...k,对 Cj 中所有样本点重新计算新的质心

  e、如果所有 k 个质心向量没发生变化,转到步骤3.

(3)、输出簇划分C = {C1,C2,...Ck}

3. K-Means初始化优化K-Means++

  K-Means++是对K-Means随机初始化质心方法的优化

  策略如下:

  a、从数据中随机选择一个点作为第一个聚类中心 μ1

  b、对数据集中的每个点 xi ,计算它与已选择聚类中心中最近聚类中心的距离

  c、选择一个新的数据点作为新的聚类中心,选择的原则为:D(x)较大的点被选择作为聚类中心的概率大

  d、重复 b 和 c 直到选出 k 个聚类质心

  e、利用这 k 个质心作为初始化质心去运行标准的 K-Means算法

4. K-Means距离计算优化elkan K-Means

  传统的 K-Means 算法,每轮迭代时,计算所有样本点到所有质心的距离,比较耗时。elkan K-Means 目标是减少不必要的距离计算。

  elkan K-Means 利用两边之和大于第三边,以及两边之差小于第三边来减少距离计算。

  第一种规律是对于每一个样本点 x 和 两个质心。如果预先计算出这两个质心之间的距离 D(j1, j2) ,发现 2D(x, j1) ≤ D(j1, j2),则 D(x, j1) ≤ D(x, j2)。此时不需要计算 D(x, j2) 。

  第二种规律是对于每一个样本点 x 和两个质心。可以得到 D(x, j2) ≥ max{0, D(x, j1) - D(j1, j2)}。这个从三角形性质很容易得到。

  利用上面两个规律,elkan K-Means 比传统的 K-Means 迭代速度有很大提高。但如果样本特征稀疏,有缺失值的话,这个方法不适用,因为某些距离无法计算,不能使用该算法。

5. 大样本优化 Mini Batch K-Means

  如果样本量非常大,10万以上,特征100万以上,K-Means 非常耗时,就算 elkan K-Means 优化也很耗时。此时用 Mini Batch K-Means。

  顾名思义,Mini Batch,就是用样本集中的一部分做传统的 K-Means,代价就是聚类的精度有一些降低。

  在 Mini Batch K-Means ,选择合适的 batch size 来做 K-Means 聚类。一般通过无放回的随机采样得到。

  为了增加算法的准确性,一般会多跑几次 Mini Batch K-Means 算法,用不同的随机采样集来得到聚类簇,选择其中最优的聚类簇。

6. K-Means与KNN

  不同点:

  1. K-Means是无监督学习的聚类算法,没有样本输出;而KNN是监督学习的分类算法,有对应的类别输出。
  2. KNN基本不需要训练,对测试集里面的点,只需要找到在训练集中最近的k个点,用这最近的k个点的类别来决定测试点的类别。而K-Means则有明显的训练过程,找到k个类别的最佳质心,从而决定样本的簇类别。
  3. KNN数据集有Label,K-Means数据无Label。

  相似点:

  两个算法都包含一个过程,即找出和某一个点最近的点。两者都利用了最近邻(nearest neighbors)的思想。

7. K-Means小结

  K-Means的主要优点有:

  1)原理比较简单,实现也是很容易,收敛速度快。

  2)聚类效果较优。

  3)算法的可解释度比较强。

  4)主要需要调参仅仅是簇数k

  K-Means的主要缺点有:

  1)K值的选取不好把握

  2)对于不是凸的数据集比较难收敛

  3)如果各隐含类别的数据不平衡,比如各隐含类别的数据量严重失衡,或者各隐含类别的方差不同,则聚类效果不佳。

  4) 采用迭代方法,得到的结果只是局部最优

  5) 对噪音和异常点比较的敏感

 来自:刘建平

原文地址:https://www.cnblogs.com/keye/p/10520177.html