K-means聚类算法-----------机器学习

k均值算法是我们学习聚类算法的第一种算法,前面我们介绍了聚类任务以及聚类任务的性能度量,但是还没有介绍具体的算法,今天我们从k均值算法开始说起,前面的博文中我们提到了EM算法,其实k均值算法中也带有EM算法的思想,我们一步一步来看。

k均值算法

给定样本集D=\{\textbf{x}_1,\textbf{x}_2,...,\textbf{x}_m\},那么k均值算法是如何将这些样本集划分为k个类别也就是k个簇C=\{C_1,C_2,...,C_k\},任何一种算法想达到某种效果,都需要有一个性能度量来衡量我这个算法最后聚类结果是否使我们满意的,那么这里k均值算法采用的是最小化同一个簇里面样本到簇中心的距离:

其中\boldsymbol{\mu}_{i}=\frac{1}{\left|C_{i}\right|} \sum_{\boldsymbol{x} \in C_{i}} \boldsymbol{x}是簇C_i的均值向量,这个式子直白的理解就是簇内样本围绕簇均值向量(簇中心)越紧密越好,和我们之前说的簇内相似度要最高,在这个式子中\textbf{E}值越小越好。

k均值算法输入:样本集D=\{\textbf{x}_1,\textbf{x}_2,...,\textbf{x}_m\}和聚类簇数k,这里我们注意这个k值是我们自己指定的,代表我们自己可以控制簇的个数。

k均值输出:簇划分C=\{C_1,C_2,...,C_k\}

我们直接使用西瓜书上的一个例子一起看看k均值的详细算法流程,并且能够更加直观的看出k均值算法和EM算法的联系。

K-means聚类算法-----------机器学习_第1张图片

上图中有30个样本,每个样本的属性只有两个。假设聚类簇数我们设置为k=3。

1. 算法开始随机选取三个样本\textbf{x}_{6},\textbf{x}_{12},\textbf{x}_{27}作为初始均值向量,即:

初始均值向量中的值正好是样本本身的属性值,关于第一步我们也可以理解为随机选取三个样本分别作为作为三个簇C_1,C_2,C_3的中心,所以从第一步中我们也可以看到,初始均值向量不同,最后的聚类结果肯定也不同,所以个人认为k均值算法不是一个稳定的算法,也就是说对于同样的样本集和k值,聚类的结果每次都不一样。 

2. 依次考虑样本集中的每个样本分别到当前均值向量\mathbf{\mu} _1,\mathbf{\mu} _2,\mathbf{\mu} _3的距离,比如我们考虑样本x_1=(0.697;0.460),它与当前均值向量\mathbf{\mu} _1,\mathbf{\mu} _2,\mathbf{\mu} _3的距离分别是0.369,0.506,0.166,很明显它与\mu _3的距离最近,所以我们认为它目前属于簇C_3,这里的距离计算我们采用的是欧氏距离。依次计算剩余样本到\mathbf{\mu} _1,\mathbf{\mu} _2,\mathbf{\mu} _3的距离,可以得到当前簇划分为:

K-means聚类算法-----------机器学习_第2张图片

3. 更新簇C_1,C_2,C_3的均值向量得到新的均值向量:

 均值向量的计算公式:\boldsymbol{\mu}_{i}=\frac{1}{\left|C_{i}\right|} \sum_{\boldsymbol{x} \in C_{i}} \boldsymbol{x}

4. 回到第二步,不断重复上面的过程,直到簇划分的结果没有变化,此时算法停止,这时就可以得到最终的簇划分结果。

K-means聚类算法-----------机器学习_第3张图片

从上图中我们可以直观的看出k均值算法在迭代的过程中每次均值和簇内划分的样本都在变化,直到簇内划分的样本没有变化也就是稳定之后,算法便停止。

k均值算法与EM算法:其中k均值算法中的第二步其实就是我们EM算法中的E步,第三步其实就是EM算法中的M步。 

我们对k均值算法做个小小的总结:

主要优点:1. 原理简单,实现容易,收敛速度快;

                  2. 算法的可解释性强;

                  3. 主要需要调参的参数只有k。

主要缺点: 1. k值的选取不好把握;

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

                    3. 采用迭代方法,只能得到局部最优的结果

                     4. 对噪音和异常点比较敏感

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

注意

上面我们提到K-means聚类算法要初始化k个数据点作为聚类中心,每次初始化不同,得到的最后的聚类结果也不同。所以可以多随机初始化几次,最后实用代价函数最小的作为聚类中心。

还有一个就是关于聚类个数k的选择,聚类任务中我们是不知道样本数据的label值,所以不知道聚类个数,可以试试肘部法则,作代价函数J和k的图,若是出现一个拐点,如下图所示,k就取拐点处的值:

K-means聚类算法-----------机器学习_第4张图片

如果曲线平滑,那就认为进行选择。 

你可能感兴趣的:(机器学习,人工智能,数据挖掘,机器学习)