KMeans聚类算法原理刘建平Pinard

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

K-Means算法的思想很简单,对于给定的样本集,按照样本之间的距离大小,将样本集划分为K个簇。让簇内的点尽量紧密的连在一起,而让簇间的距离尽量的大。

如果用数据表达式表示,假设簇划分为$(C_1,C_2,...C_k)$,则我们的目标是最小化平方误差E:$$E=\sum\limits_{i=1}^k\sum\limits_{x\inC_i}||x-\mu_i||_2^2$$

其中$\mu_i$是簇$C_i$的均值向量,有时也称为质心,表达式为:$$\mu_i=\frac{1}{|C_i|}\sum\limits_{x\inC_i}x$$

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

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

上图a表达了初始的数据集,假设k=2。在图b中,我们随机选择了两个k类所对应的类别质心,即图中的红色质心和蓝色质心,然后分别求样本中所有点到这两个质心的距离,并标记每个样本的类别为和该样本距离最小的质心的类别,如图c所示,经过计算样本和红色质心和蓝色质心的距离,我们得到了所有样本点的第一轮迭代后的类别。此时我们对我们当前标记为红色和蓝色的点分别求其新的质心,如图4所示,新的红色质心和蓝色质心的位置已经发生了变动。图e和图f重复了我们在图c和图d的过程,即将所有点的类别标记为距离最近的质心的类别并求新的质心。最终我们得到的两个类别如图f。

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

在上一节我们对K-Means的原理做了初步的探讨,这里我们对K-Means的算法做一个总结。

首先我们看看K-Means算法的一些要点。

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

好了,现在我们来总结下传统的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$和各个质心向量$\mu_j(j=1,2,...k)$的距离:$d_{ij}=||x_i-\mu_j||_2^2$,将$x_i$标记最小的为$d_{ij}$所对应的类别$\lambda_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\inC_j}x$

e)如果所有的k个质心向量都没有发生变化,则转到步骤3)

3)输出簇划分$C=\{C_1,C_2,...C_k\}$

K-Means++的对于初始化质心的优化策略也很简单,如下:

a)从输入的数据点集合中随机选择一个点作为第一个聚类中心$\mu_1$b)对于数据集中的每一个点$x_i$,计算它与已选择的聚类中心中最近聚类中心的距离$D(x_i)=arg\;min||x_i-\mu_r||_2^2\;\;r=1,2,...k_{selected}$

c)选择一个新的数据点作为新的聚类中心,选择的原则是:$D(x)$较大的点,被选取作为聚类中心的概率较大d)重复b和c直到选择出k个聚类质心e)利用这k个质心来作为初始化质心去运行标准的K-Means算法

在传统的K-Means算法中,我们在每轮迭代时,要计算所有的样本点到所有的质心的距离,这样会比较的耗时。那么,对于距离的计算有没有能够简化的地方呢?elkanK-Means算法就是从这块入手加以改进。它的目标是减少不必要的距离的计算。那么哪些距离不需要计算呢?

elkanK-Means利用了两边之和大于等于第三边,以及两边之差小于第三边的三角形性质,来减少距离的计算。

第一种规律是对于一个样本点$x$和两个质心$\mu_{j_1},\mu_{j_2}$。如果我们预先计算出了这两个质心之间的距离$D(j_1,j_2)$,则如果计算发现$2D(x,j_1)\leqD(j_1,j_2)$,我们立即就可以知道$D(x,j_1)\leqD(x,j_2)$。此时我们不需要再计算$D(x,j_2)$,也就是说省了一步距离计算。

第二种规律是对于一个样本点$x$和两个质心$\mu_{j_1},\mu_{j_2}$。我们可以得到$D(x,j_2)\geqmax\{0,D(x,j_1)-D(j_1,j_2)\}$。这个从三角形的性质也很容易得到。

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

在统的K-Means算法中,要计算所有的样本点到所有的质心的距离。如果样本量非常大,比如达到10万以上,特征有100以上,此时用传统的K-Means算法非常的耗时,就算加上elkanK-Means优化也依旧。在大数据时代,这样的场景越来越多。此时MiniBatchK-Means应运而生。

顾名思义,MiniBatch,也就是用样本集中的一部分的样本来做传统的K-Means,这样可以避免样本量太大时的计算难题,算法收敛速度大大加快。当然此时的代价就是我们的聚类的精确度也会有一些降低。一般来说这个降低的幅度在可以接受的范围之内。

在MiniBatchK-Means中,我们会选择一个合适的批样本大小batchsize,我们仅仅用batchsize个样本来做K-Means聚类。那么这batchsize个样本怎么来的?一般是通过无放回的随机采样得到的。

为了增加算法的准确性,我们一般会多跑几次MiniBatchK-Means算法,用得到不同的随机采样集来得到聚类簇,选择其中最优的聚类簇。

初学者很容易把K-Means和KNN搞混,两者其实差别还是很大的。

K-Means是无监督学习的聚类算法,没有样本输出;而KNN是监督学习的分类算法,有对应的类别输出。KNN基本不需要训练,对测试集里面的点,只需要找到在训练集中最近的k个点,用这最近的k个点的类别来决定测试点的类别。而K-Means则有明显的训练过程,找到k个类别的最佳质心,从而决定样本的簇类别。

当然,两者也有一些相似点,两个算法都包含一个过程,即找出和某一个点最近的点。两者都利用了最近邻(nearestneighbors)的思想。

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

K-Means的主要优点有:

1)原理比较简单,实现也是很容易,收敛速度快。

2)聚类效果较优。

3)算法的可解释度比较强。

4)主要需要调参的参数仅仅是簇数k。

K-Means的主要缺点有:

1)K值的选取不好把握

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

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

4)采用迭代方法,得到的结果只是局部最优。

5)对噪音和异常点比较的敏感。

(欢迎转载,转载请注明出处。欢迎沟通交流:liujianping-ok@163.com)

THE END
1.KMeans聚类算法的原理及实现kmeans串行算法原理K-Means聚类算法的原理及实现 【转】http://www.aboutyun.com/thread-18178-1-1.html 问题导读: 1、如何理解K-Means算法? 2、如何寻找K值及初始质心? 3、如何应用K-Means算法处理数据? K-Means是聚类算法中的一种,其中K表示类别数,Means表示均值。顾名思义K-Means是一种通过均值对数据点进行聚类的算法。Khttps://blog.csdn.net/GoodShot/archive/2011/05/27/78128097.aspx
2.KK-means聚类算法的原理与应用场景解析 芋泥香鸭 149粉丝 · 234个视频 关注 接下来播放自动播放 09:55 和女儿去卖冬笋,经过几次调价才卖完,但收获满满,把她高兴坏了 土耳其阿布 38万次播放 · 2.0万次点赞 01:01 陈乔恩老公画作被拍卖,成功拍出22万新台币,创作为中西元素结合 娱8嘴 2.1万次播放 · 34次https://haokan.baidu.com/v?pd=wisenatural&vid=10221152576596758141
3.kk-means算法是非监督聚类最常用的一种方法,因其算法简单和很好的适用于大样本数据,广泛应用于不同领域,本文详细总结了k-means聚类算法原理 。 目录 1. k-means聚类算法原理 2. k-means聚类算法步骤 3. k-means++聚类优化算法 4. 小批量处理的k-means聚类算法 https://mp.weixin.qq.com/s?__biz=MzU0MDQ1NjAzNg==&mid=2247486771&idx=1&sn=cc1ee930134b5f5cbdb4637a9d80982d&chksm=fb39a838cc4e212e2e1d0db3d3b47e5c8d274cdf899def51f0a00a803c937b550cd06a703add&scene=27
4.kmeans算法的原理是什么问答k均值(k-means)聚类算法是一种常用的聚类分析方法,其主要思想是将数据集中的数据点划分为k个簇,使得每个数据点都属于与其最近的簇中心所代表的簇。k均值算法的原理如下:1. 随机选择k个初始簇https://www.yisu.com/ask/7488761.html
5.Kmeans算法的基本原理1.聚类1.1. DBSCAN 1.1.1. DBSCAN原理1.1.2 粗糙伪代码 1.2K-means1.2.1K-Means原理1.2.2K-means伪代码 1.3 层次聚类1.3.1 层次聚类的原理1.3.2 如何确定如何取cluster? 1.3.3 层次聚类伪代码 1.4算法之间的优缺点 1.4.1K-means1.4.2 DBSCAN算法:基于密度的聚类 https://www.pianshen.com/article/52991392139/
6.零基础学习Kmeans聚类算法的原理与实现过程其原理即需要将一堆散点进行聚类,聚类目标是“类内的点足够近,类间的点足够远”,而你需要做的就是(1)确定聚类数目;(2)挑选初始中心点;(3)迭代重置中心点直到满足“类内的点足够近,类间的点足够远”,典型的基于划分的聚类就是K-means算法。 K-means算法流程https://www.jianshu.com/p/6ff067b9e2ba
7.聚类算法:Kmeans和Kmeans++算法精讲3.1原理 原始Kmeans算法最开始随机选取数据集中k个点作为聚类中心,k个初始化的质心的位置选择对最后的聚类结果和运行时间都有很大的影响,因此需要选择合适的k个质心。如果仅仅是完全随机的选择,有可能导致算法收敛很慢。Kmeans++算法主要对对K-Means初始值选取的方法的优化。也就是说,Kmeans++算法与Kmeans算法最本质https://developer.aliyun.com/article/1309827
8.KMeans聚类算法一、KMeans原理 KMeans是一个迭代求解的聚类算法,其属于划分(Partitioning)型的聚类方法,即首先创建K个划分,然后迭代地将样本从一个划分转移到另一个划分来改善最终聚类的质量,KMeans的过程大致如下: 1.根据给定的k值,选取k个样本点作为初始划分中心; https://mocom.xmu.edu.cn/article/show/586df21caa2c3f280956e7b3/0/1
9.Kmeans均值聚类算法原理以及Python如何实现pythonKmeans均值聚类算法原理以及Python如何实现 这个算法中文名为k均值聚类算法,首先我们在二维的特殊条件下讨论其实现的过程,方便大家理解。 第一步.随机生成质心 由于这是一个无监督学习的算法,因此我们首先在一个二维的坐标轴下随机给定一堆点,并随即给定两个质心,我们这个算法的目的就是将这一堆点根据它们自身的坐标https://www.jb51.net/article/196540.htm
10.KMeans算法全面解析与应用案例腾讯云开发者社区KMeans算法全面解析与应用案例 本文深入探讨了KMeans聚类算法的核心原理、实际应用、优缺点以及在文本聚类中的特殊用途,为您在聚类分析和自然语言处理方面提供有价值的见解和指导。 一、聚类与KMeans介绍 聚类算法在机器学习和数据挖掘中占有重要的地位,它们用于自动地将数据分组成有意义的集群。KMeans聚类算法是其中最https://cloud.tencent.com/developer/article/2348495
11.Python数模笔记Sklearn(2)聚类分析4、K-均值(K-Means)聚类算法 K-均值聚类算法,是最基础的、应用最广泛的聚类算法,也是最快速的聚类算法之一。 4.1 原理和过程 K-均值聚类算法以最小化误差函数为目标将样本数据集分为 K类。 K-均值聚类算法的计算过程如下: 设定K 个类别的中心的初值; https://www.flyai.com/article/896
12.最常用的聚类算法——KMeans原理详解和实操应用(R&Python)1 K-Means算法引入 基于相似性度量,将相近的样本归为同一个子集,使得相同子集中各元素间差异性最小,而不同子集间的元素差异性最大[1],这就是(空间)聚类算法的本质。而K-Means正是这样一种算法的代表。 图1 二维空间聚类的例子 [1] 上个世纪50/60年代,K-Means聚类算法分别在几个不同的科学研究领域被独立https://zhuanlan.zhihu.com/p/619739126