简单易懂的人工智能系列:K-means算法

K-Means

算法概念

k-Mens即K均值聚类,属于划分聚类。其工作原理为根据初始化的聚类中心信息,计算每个样本到这些中心的距离,可以判断每个样本 均归属于某个类簇,更新聚类中心信息,重新计算每个样本到新的聚类中心的距离,重新划分样本到新的聚类中心对应的类中,重复进行,知道满足终止条件

如果用数据表达式表示,假设簇划分为,则我们的目标是最小化平方误差E:

                                               

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

                                                         

如果我们想直接求上式的最小值并不容易,这是一个NP难的问题,因此只能采用启发式的迭代方法。

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

有N个样本点,使用K-Means将其聚类的步骤:

其中 Step3 中的重新计算k个类粗的中心点可采用平均距离中心——质心的计算公式。上图以 K 为2,样本数为 N 来描述KMean算法。

当然在实际K-Mean算法中,我们一般会多次运行图c和图d,才能达到最终的比较优的类别

具体实现步骤

第一步,确定聚类个数,确定聚类中心,确定距离计算公式

1. 对于K-Means算法,首先要注意的是k值的选择,一般来说,我们会根据对数据的先验经验选择一个合适的k值,如果没有什么先验知识,则可以通过交叉验证选择一个合适的k值。

2. 在确定了k的个数后,我们需要选择k个初始化的质心,就像上图b中的随机质心。由于我们是启发式方法,k个初始化的质心的位置选择对最后的聚类结果和运行时间都有很大的影响,因此需要选择合适的k个质心,最好这些质心不能太近。

常用的几种距离计算方法

通常情况下,在聚类算法中,样本的属性主要由其在特征空间中的相对距离来表示。这就使得距离这个概念,对于聚类非常重要。以下是几种最常见的距离计算方法:

欧式距离(又称 2-norm 距离或平方距离)

在欧几里德空间中,点 x=(x1,…,xn) 和 y=(y1,…,yn) 之间的欧氏距离为:

在欧几里德度量下,两点之间线段最短。

余弦距离(又称余弦相似性)

两个向量间的余弦值可以通过使用欧几里德点积公式求出:

                                                a⋅b=∥a∥∥b∥cosθ

所以:

                                          

也就是说,给定两个属性向量 A 和 B,其余弦距离(也可以理解为两向量夹角的余弦)由点积和向量长度给出,如下所示:

                     

这里的 Ai 和 Bi 分别代表向量 A 和 B 的各分量。

曼哈顿距离(Manhattan Distance, 又称 1-norm 距离或绝对值距离)

曼哈顿距离的定义,来自于计算在规划为方型建筑区块的城市(如曼哈顿)中行车的最短路径。

假设一个城市是完备的块状划分,从一点到达另一点必须要按照之间所隔着的区块的边缘走,没有其他捷径(如下图):

                                          

因此,曼哈顿距离就是:在直角座标系中,两点所形成的线段对 x 和 y 轴投影的长度总和。

从点 (x1,y1) 到点 (x2,y2),曼哈顿距离为:

                                                    |x1−x2|+|y1−y2|

第二步,计算每个点和聚类中心的距离,进行归类

第三步,计算当前类簇的中心,更新聚类中心 Ck 的位置(质心法)

重复第二、三步,将各样本Si点根据新聚类中心Ck进行重新划分,根据最新聚类结果计算最新聚类中心,更新Ck取值

重复第二、三步,知道聚类中心不再变化,或者循环次数达到预先 设定的阈值,结束,得到聚类结果

 

实现伪码

选择k个点作为初始类簇中心

repeat

     将每个样本点指派到最近的类簇中心,形成K个类簇

     重新计算每个类簇的中心

until 类簇不发生变化 or 达到最大迭代ci

实现源码

定义一个计算欧式距离的函数distEucDistance

定义初始化K个聚类中心的函数

定义k-均值算法函数kMeans:

 

K-means优缺点

优点:

缺点:

非球状聚类效果图示(很差):

K-means算法思考

  • 异常点的存在:K-means算法在迭代的过程中使用所有点的均值作为新的质点(中心点),如果簇中存在异常点,将导致均值偏差比较严重。 比如一个簇中有2、4、6、8、100五个数据,那么新的质点为24,显然这个质点离绝大多数点都比较远;在当前情况下,使用中位数6可能比使用均值的想法更好,使用中位数的聚类方式叫做K-Mediods聚类(K中值聚类)。
  • 初值敏感:K-means算法是初值敏感的,选择不同的初始值可能导致不同的簇划分规则。为了避免这种敏感性导致的最终结果异常性,可以采用初始化多套初始节点构造不同的分类规则,然后选择最优的构造规则。针对这点后面因此衍生了:二分K-Means算法、K-Means++算法、K-Means||算法、Canopy算法等。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章