俗话说“物以类聚,人以群分”,这句话在K-means聚类算法里面得到了充分的继承。而K-means算法的实际应用范围可谓是大到无法估量,基本可以说,只要你想不到,没有聚类聚不起来的东西!
比如衣服制造商可以通过分类,把某个身高体重的人群划为一类,然后根据这些人群的需求制作出适合尺寸的衣服,此后在网上买衣服,只需报给商家身高体重,就有相应的S\M\L码数衣服满足你的需求。再比如著名的谷歌(Google )新闻版块,就是使用了聚类算法,每天谷歌都从网上收集上万条新闻,然后通过机器学习分类出各种类型的新闻,把相同类型的新闻展示在同一个页面上,使得客户可以快速地浏览同一个新闻不同官方的报道。
诸如此类,k-means聚类算法作为容易理解而又应用广泛的算法,想要理解也并不难,下面我就用我自己的理解,带你们走近k-means算法的内心世界。
在使用K-means之前,我们需要手动去定义一个聚类中心(K值),你不知道这是什么东西?没关系,请看下面这个图。
图中我们可以看到,有很多分散的黑色数据点(特征点),而我们的聚类中心(K值)就是图上的两个”十“字,它的数量决定了我们的这堆数据会被划分为几种类型。
在例子中,我们就假设有两个聚类中心(位置是随机的)。
当确定好了K值之后,我们就进入K-means算法开始运算了,在K-means算法里,主要是一个内循环,内循环主要包含两个内容:
不知道这两个是什么东西没关系,我来解释给你听
首先是聚类中心找到自己的同类,其实就是把这些特征点分类的意思。在簇分配里,我们把所有黑色的特征点与两个聚类中心的距离计算出来,得出每个点相对于两个聚类中心的距离。然后,把距离聚类中心点最近的特征点涂成属于自己的颜色,就成为了一个子集(或者叫簇),结果如图所示。
类似一个用一个圆,把属于自己的特征点全部包起来
这个就是簇分配
当所有的聚类中心都找到了属于自己的同类之后,就要走过去拥抱欢呼顺便一起哭一下了,具体的方法是:在自己的簇类里,计算出簇内样本的平均值,然后让聚类中心走到平均值相应的位置。
如图所示
当聚类中心移动之后,所有的特征点将全部变回黑色
然后又重新开始从第一个步骤开始循环,先计算每个特征点相对于两个聚类中心的距离,距离最近的涂上自己的颜色(簇分配),跑上去拥抱(移动聚类中心),特征点又变回黑色,重新计算......
程序一直在循环,一直循环到当两个聚类中心移动到图下这个位置
这时,不管程序再怎么循环,聚类中心的位置已经不再发生改变了,这时候,我们就可以说K均值已经聚合(或者收敛),k-means聚类算法就已经完成了它的任务,分类完成。
最后,程序退出k-means算法的内循环,开始下一步其他操作。