前言
作为无监督聚类算法中的代表——K均值(K-means)聚类(clustering)算法,该算法的主要作用是将相似的样本自动回归到一个类别中。所谓的无监督算法,就是输入样本没有对应输出或标签。聚类(clustering)试图将数据集中的样本划分为若干个通常是不相交的子集,每个子集成为一个簇(cluster),聚类既能作为一个单独过程,用于寻找数据内在的分布结构,也可作为分类等其他学习任务的前去过程——《Machine Learning》。
聚类算法也许是机器学习中“新算法”出现最多最快的领域,一个重要的原因在于聚类不存在客观标准,给定数据集总能从某个角度找到以往算法未覆盖的某种标准从而设计出新算法。Kmeans算法十分简单易懂而且非常有效,但是合理的确定K值和K个初始类簇中心点对于聚类效果的好坏有很大的影响。众多的论文基于此都提出了各自行之有效的解决方案,新的改进算法仍然不断被提出,此类文章大家可以在Web Of Science中搜索。
尽管Kmeans算法在Matlab、Python等语言的工具箱函数中都有自带的函数可以调用,但作为机器学习的研究者来说要设计出新的算法,有时候得定制自己的Kmeans函数。
Kmeans算法的原理与理解
Kmeans算法是最常用的聚类算法,主要思想是:在给定K值和K个初始类簇 中心点的情况下,把每个点(亦即数据记录)分离到离其最近的类簇中心点所代表的类簇中,所有点分配完毕后,根据一个类簇内的所有点重新计算该类簇的中心点(取平均值),然后再迭代的进行分配点和更新类簇中心点的步骤,直至类簇中心点的变化很小或者达到指定的迭代次数。
基本原理
假定给定数据样本,包含了
个对象
,其中每个对象都具有
个维度的属性。Kmeans算法的目标是将n个对象依据对象间的相似性聚集到指定的k个类簇中,每个对象属于且仅属于一个其到类簇中心距离最小的类簇中。对于Kmeans,首先需要初始化k个聚类中心
,然后通过计算每一个对象到每一个聚类中心的欧氏距离,如下所示:
上式中,表示第i个对象
表示第j个聚类中心的
表示第i个对象的第t个属性,
表示第j个聚类中心的第t个属性。
依次比较每一个对象到每一个聚类中心的距离,将对象分配到距离最近的聚类中心的类簇中,得到k个类簇。
Kmeans算法用中心定义了类簇的原型,类簇中心就是类簇内所有对象在各个维度的均值,其计算公式如下
式中,表示第
个聚类的中心,
表示第
个类簇中对象的个数,
表示第
个类簇中第
个对象,
。
算法流程
输入:样本集,聚类簇数k。
过程:
1:从D中随机选择k个样本作为初始均值向量。
2:repeat
3:令
4:for j=1,2,…,m do
5:计算样本与各均值向量
的距离:
;
6:根据距离最近的均值向量确定的簇标记:
;
7:将样本划入相应的簇:
;
8:end for
9:for i=1,2,…,k do
10:计算新均值向量:;
11:
12:将当前均值向量为更新为
13:else
14:保持当前均值不变
15:end if
16: end for
17:until 当前均值向量未更新
输出:簇划分