前言

  在机器学习的无监督算法中,可能C均值算法是较早出现(笔者在韩家炜教授上世纪90年代所著的《数据挖掘》中最早看到)同时其若干变种可能也是应用最为广泛的一类无监督算法,只不过那时可能机器学习一词使用的还不甚广泛,而是叫做数据挖掘(Data Mining),不过无论采用何种称谓,其本质其实并没有什么不同,而且需要说明的一点是,这种算法在业界又被称作K均值算法(即KMeans)。

  在前面讨论混合高斯聚类方法时,本来笔者提到无意阐述这个算法(可能过于简单抑或它已经烂大街了?就像MINST库被玩残了一样),但其有一个所谓的模糊C均值聚类,这个模型还是有些讨论价值的。

   对于一般聚类算法而言,其实我们主要考量两个原则,一个是类内聚合程度以及类间分离程度,故以下的相关讨论一般都是围绕这两个原则进行的,包括后面会写到的相关基于密度的无参数聚类算法,如削峰法以及描峰法等(其实对于其它非聚类算法而言,也一般需要遵从这两个原则,而对于监督分类算法则不完全一样,因为样本点已经被进行了标识,即打了标签)。

基础C均值算法

   根据类聚合原则而言,对于样本的相关分类当然是类内的差异越小越好,而类间的差异是越大越好,这样方能达到我们对于聚类的需求,但采用不同的类聚合评估函数会导致不同的聚类结果,而人们习惯上会使用样本方差这个指标来评估它们之间的差异程度。

           如果我们使用软性类划分矩阵,则可以给出如下公式:

wKioL1nmmQ7yQuZVAAAOcbm7ins070.png-wh_50

   其中,而表示样本的第i类的集合,而D是样本与类差异的评估函数,那么根据上式显然我们能够得到相关目标函数的表达式:

wKioL1nmmTiTqd-cAAAOMvWEitY052.png-wh_50

   对于上式而言,需要求解两组参数,按照之前机器学习的经验,我们可以交叉进行,即先固定一组参数,求解另一组,然后再优化另一组。

            先对参数类X进行求导并令其结果为0,我们有:

wKioL1nmmafQs0DFAAAQznBhaGE338.png-wh_50

   根据公式3可得如下结果:

wKiom1nmnIzhY-t6AAAPcA93_MU949.png-wh_50

  

   然后固定参数X(注意这是一个具有维度为C的向量)再求解参数u(这里没法对公式2求偏导了)。我们对于公式4的理解可以是这样的,先随机化归属度矩阵,然后计算类内的相关值,那么如何再求解参数u?一般我们只要考虑对于每个样本而言,其到所属类的距离是不是大于某个阈值,如果是则将其在所属度矩阵的赋值变为1,而其它分量则改成0,否则修改成0,而将其所属度值加到别的分量上(其实最终归属度矩阵都会变成One-Hot-Vector)。

  如此循环往复直到整体收敛。上述算法步骤其实与网上介绍的一般C均值聚类算法不太一样,传统的做法如下:

 

  1. 在样本集合中选择C个点作为初始类中心;

  2. 在剩下的样本点中选择一个,计算其到各个中心点的距离,选取距离最短者将其归为那个类别;

  3. 选择下一个样本,重复2直到计算完所有样本,若集合不发生变化或达到迭代上限则转5否则转4

  4. 根据当前的类划分情况重新计算中心点,重复步骤2

  5. 结束算法。

 

  可以看出上述算法的复杂度为O(NCt),其中N是样本个数,C是类别数量,而t是迭代的次数。

 

         那么C均值的算法存在什么问题?其一就是最终划分的结果仍是硬分类,而且对于初值的选取也会导致结果可能存在不同(会达到局部鞍点)或者收敛速度过慢。

模糊C均值算法

  在上节的C均值算法中,即便归属度矩阵的元素初始值不为整数,但算法执行完毕后仍会得到样本的硬分类,这个在很多场合是不太适用的,故本节主要讨论模糊的C均值算法,即分类算法执行完成后,我们得到的是样本的软分类结果。

   为了达到上述目标,我们对公式2加入约束,并使用拉格朗日乘数法,公式变为如下形式(其中对于归属度矩阵的每个元素我们加入了m,这个被称作加权归属度,一般它大于等于1):

wKiom1nmnNSzWzjOAAAQrbBlYkA547.png-wh_50

  对于上式,后面一部分就是增加的约束,可以明显看出约束即为,那么同样的分别对公式5求各个参数的偏导(与上节不同,由于使用了拉格朗日乘数法故含有三个参数需要求解),我们有:

wKiom1nmnQmi6ed4AAAP-pfxL3Q664.png-wh_50

  这个公式与之前相对应的公式并无太大差别,而对于参数而言,因为使用了拉格朗日乘数法所以也能对公式5求取偏导,得:

wKioL1nmmoHRO6ZLAAASOxl60zQ928.png-wh_50

 至于上述公式是怎么的来的?我们有如下推导(《机器学习》这本书没有进行相关介绍,现笔者交代下过程以免造成误解),对于参数λ的偏导,我们可以得到如下公式:

关于机器学习中C均值算法的相关介绍_第1张图片

  综合公式9和公式10,我们有如下的推导(注意这里使用了下标j,而不是i,这是为了进行一定程度的区分,其实意思上并没有什么不同):

关于机器学习中C均值算法的相关介绍_第2张图片

  然后将以上公式带回到公式10中就能得到最终的结果,得证。