K-Means聚类算法

前言

K-Means算法是无监督的聚类算法,它实现起来比较简单,聚类效果也不错,因此应用很广泛。K-Means算法有大量的变体,本文就从最传统的K-Means算法讲起,在其基础上讲述K-Means的优化变体方法。包括初始化优化K-Means++, 距离计算优化elkan K-Means算法大数据情况下的优化Mini Batch K-Means算法

传统K-Means算法

K-Means算法的思想很简单,对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大
如果用数学表达式表示,假设簇划分为\((C_1,C_2,...C_k)\),则我们的目标是最小化平方误差\(E\)
\(E = \sum\limits_{i=1}^k\sum\limits_{x \in C_i} ||x-\mu_i||_2^2\)
其中\(μ_i\)是簇\(C_i\)的均值向量,有时也称为质心,表达式为:\(\mu_i = \frac{1}{|C_i|}\sum\limits_{x \in C_i}x\).
如果我们想直接求上式的最小值并不容易,这是一个NP难的问题,因此只能采用启发式的迭代方法
传统的K-Means算法流程如下:
输入是样本集\(D=\{x_1,x_2,...x_m\}\),聚类的簇数为\(k\),最大迭代次数\(N\)
输出是簇划分\(C=\{C_1,C_2,...C_k\}\)

  • 1)从数据集\(D\)中随机选择\(k\)个样本作为初始的\(k\)个质心向量:\(\{\mu_1,\mu_2,...,\mu_k\}\)
  • 2)对于\(n=1,2,...,N\)
    • a)将簇划分C初始化为\(C_t = \varnothing \;\; t =1,2...k\)
    • b)对于\(i=1,2...m\),计算样本\(x_i\)和各个质心向量\(μ_j(j=1,2,...k)\)的距离:\(d_{ij} = ||x_i - \mu_j||_2^2\),将\(x_i\)标记为最小的\(d_{ij}\)所对应的簇类别\(λ_i\)。此时更新\(C_{\lambda_i} = C_{\lambda_i} \cup \{x_i\}\)
    • c)对于\(j=1,2,...,k\),对\(C_j\)中所有的样本点重新计算新的质心\(\mu_j = \frac{1}{|C_j|}\sum\limits_{x \in C_j}x\)
    • d)如果所有的k个质心向量都没有发生变化,则转到步骤3。
  • 3)输出簇划分\(C=\{C_1,C_2,...C_k\}\)

从算法流程上,我们可以看出K-Means聚类与EM算法流程类似。在K-Means聚类时,每个聚类簇的质心是隐含数据。我们会假设K个初始化质心,即EM算法的E步;然后计算得到每个样本最近的质心,并把样本聚类到最近的这个质心,即EM算法的M步。重复这个E步和M步,直到质心不再变化为止,这样就完成了K-Means聚类。
我们可以看出K-Means算法的一些要点。

  • 1)对于K-Means算法,首先要注意的是k值的选择,一般来说,我们会根据对数据的先验经验选择一个合适的k值,如果没有什么先验知识,则可以通过交叉验证选择一个合适的k值。
  • 2)在确定了k的个数后,我们需要选择k个初始化的质心,就像上面的随机质心。由于我们是启发式方法,k个初始化的质心的位置选择对最后的聚类结果运行时间都有很大的影响,因此需要选择合适的k个质心,最好这些质心不能太近

K-Means的优化变体方法

初始化优化之K-Means++

在上节我们提到,k个初始化的质心的位置选择对最后的聚类结果和运行时间都有很大的影响,因此需要选择合适的k个质心。如果仅仅是完全随机的选择,有可能导致算法收敛很慢。K-Means++算法就是对K-Means随机初始化质心的方法的优化。
它的优化策略很简单,如下:

  • a)从输入的数据点集合中随机选择一个点作为第一个聚类中心\(μ_1\)
  • b)对于数据集中的每一个点\(x_i\),计算它与已选择的聚类中心中最近聚类中心的距离\(D(x_i) = min||x_i- \mu_r||_2^2\;\;r=1,2,...k_{selected}\)
  • c)选择一个新的数据点作为新的聚类中心,选择的原则是:\(D(x)\)较大的点,被选取作为聚类中心的概率较大。
  • d)重复b和c直到选择出k个聚类质心。
  • e)利用这k个质心来作为初始化质心去运行标准的K-Means算法。

距离计算优化之elkan K-Means

在传统的K-Means算法中,我们在每轮迭代时,要计算所有的样本点所有的质心的距离,这样会比较的耗时。那么,对于距离的计算有没有能够简化的地方呢?elkan K-Means算法就是从这块入手加以改进。它的目标是减少不必要的距离的计算。那么哪些距离不需要计算呢?
elkan K-Means利用了两边之和大于等于第三边,以及两边之差小于第三边的三角形性质,来减少距离的计算。

  • 第一种规律是对于一个样本点\(x\)和两个质心\(μ_{j_1},μ_{j_2}\)。如果我们预先计算出了这两个质心之间的距离\(D(j_1,j_2)\),则如果计算发现\(2D(x,j_1)≤D(j_1,j_2)\),我们立即就可以知道\(D(x,j_1)≤D(x,j_2)\)。此时我们不需要再计算\(D(x,j_2)\),也就是说省了一步距离计算。
  • 第二种规律是对于一个样本点\(x\)和两个质心\(μ_{j_1},μ_{j_2}\)。我们可以得到\(D(x,j_2)≥max\{0,D(x,j_1)−D(j_1,j_2)\}\)。这个从三角形的性质也很容易得到。

利用上边的两个规律,elkan K-Means比起传统的K-Means迭代速度有很大的提高。但是如果我们的样本的特征是稀疏的,有缺失值的话,这个方法就不使用了,此时某些距离无法计算,则不能使用该算法。

大样本优化之Mini Batch K-Means

在传统的K-Means算法中,要计算所有的样本点到所有的质心的距离。如果样本量非常大,比如达到10万以上,特征有100以上,此时用传统的K-Means算法非常的耗时,就算加上elkan K-Means优化也依旧。在大数据时代,这样的场景越来越多。此时Mini Batch K-Means应运而生。
顾名思义,Mini Batch,也就是用样本集中的一部分的样本来做传统的K-Means,这样可以避免样本量太大时的计算难题,算法收敛速度大大加快。当然此时的代价就是我们的聚类的精确度也会有一些降低。一般来说这个降低的幅度在可以接受的范围之内。
在Mini Batch K-Means中,我们会选择一个合适的批样本大小batch size,我们仅仅用batch size个样本来做K-Means聚类。那么这batch size个样本怎么来的?一般是通过无放回的随机采样得到的
为了增加算法的准确性,我们一般会多跑几次Mini Batch K-Means算法,用得到的不同的随机采样集来得到聚类簇,选择其中最优的聚类簇。

小结

K-Means是个简单实用的聚类算法,这里对K-Means的优缺点做一个总结。
主要优点

  • 原理比较简单,实现也是很容易,收敛速度快。
  • 聚类效果较优。
  • 算法的可解释度比较强。
  • 主要需要调参的参数仅仅是簇数k。

主要缺点

  • K值的选取不好把握。
  • 对于不是凸的数据集比较难收敛。
  • 如果各隐含类别的数据不平衡,比如各隐含类别的数据量严重失衡,或者各隐含类别的方差不同,则聚类效果不佳。
  • 采用迭代方法,得到的结果只是局部最优
  • 对噪声和异常点比较的敏感。

posted on 2021-04-17 20:23  朴素贝叶斯  阅读(109)  评论(0编辑  收藏  举报

导航