5 分钟带你弄懂 k-means 聚类

聚类与分类的区别web

分类:类别是已知的,经过对已知分类的数据进行训练和学习,找到这些不一样类的特征,再对未分类的数据进行分类。属于监督学习。算法

聚类:事先不知道数据会分为几类,经过聚类分析将数据聚合成几个群体。聚类不须要对数据进行训练和学习。属于无监督学习。svg

关于监督学习和无监督学习,这里给一个简单的介绍:是否有监督,就看输入数据是否有标签,输入数据有标签,则为有监督学习,不然为无监督学习。更详尽的解释会在后续博文更新,这里不细说。函数

k-means 聚类学习

聚类算法有不少种,K-Means 是聚类算法中的最经常使用的一种,算法最大的特色是简单,好理解,运算速度快,可是只能应用于连续型的数据,而且必定要在聚类前须要手工指定要分红几类。spa

K-Means 聚类算法的大体意思就是“物以类聚,人以群分”:code

  1. 首先输入 k 的值,即咱们指定但愿经过聚类获得 k 个分组;
  2. 从数据集中随机选取 k 个数据点做为初始大佬(质心);
  3. 对集合中每个小弟,计算与每个大佬的距离,离哪一个大佬距离近,就跟定哪一个大佬。
  4. 这时每个大佬手下都汇集了一票小弟,这时候召开选举大会,每一群选出新的大佬(即经过算法选出新的质心)。
  5. 若是新大佬和老大佬之间的距离小于某一个设置的阈值(表示从新计算的质心的位置变化不大,趋于稳定,或者说收敛),能够认为咱们进行的聚类已经达到指望的结果,算法终止。
  6. 若是新大佬和老大佬距离变化很大,须要迭代3~5步骤。

说了这么多,估计仍是有点糊涂,下面举个很是形象简单的例子:
有6个点,从图上看应该能够分红两堆,前三个点一堆,后三个点另外一堆。如今我手工地把 k-means 计算过程演示一下,同时检验是否是和预期一致:
这里写图片描述xml

1.设定 k 值为2blog

2.选择初始大佬(就选 P1 和 P2)图片

3.计算小弟与大佬的距离:

这里写图片描述
从上图能够看出,全部的小弟都离 P2 更近,因此次站队的结果是:

A 组:P1
B 组:P二、P三、P四、P五、P6

4.召开选举大会:

A 组没什么可选的,大佬就是本身
B 组有5我的,须要从新选大佬,这里要注意选大佬的方法是每一个人 X 坐标的平均值和 Y 坐标的平均值组成的新的点,为新大佬,也就是说这个大佬是“虚拟的”。所以,B 组选出新大哥的坐标为:P 哥((1+3+8+9+10)/5,(2+1+8+10+7)/5)=(6.2,5.6)。
综合两组,新大哥为 P1(0,0),P哥(6.2,5.6),而P2-P6从新成为小弟。

5.再次计算小弟到大佬的距离:
这里写图片描述

这时能够看到P二、P3离P1更近,P四、P五、P6离P哥更近,因此第二次站队的结果是:

A 组:P一、P二、P3
B 组:P四、P五、P6(虚拟大哥这时候消失)

6.第二届选举大会:
一样的方法选出新的虚拟大佬:P哥1(1.33,1),P哥2(9,8.33),P1-P6都成为小弟。

7.第三次计算小弟到大佬的距离:
这里写图片描述
这时能够看到 P一、P二、P3 离 P哥1 更近,P四、P五、P6离 P哥2 更近,因此第二次站队的结果是:
A 组:P一、P二、P3
B 组:P四、P五、P6

咱们能够发现,此次站队的结果和上次没有任何变化了,说明已经收敛,聚类结束,聚类结果和咱们最开始设想的结果彻底一致。

K-Means 聚类 MATLAB 实现

关于 K-Means 的算法具体代码,网上有各类版本,这里也不赘述了,下面结合 MATLAB 中的一些函数给出一个较为简洁的版本:

X2 = zscore(X); % zscore方法标准化数据 
Y2 = pdist(X2); % 计算距离(默认欧式距离)
Z2 = linkage(Y2); % 定义变量之间的链接,用指定的算法计算系统聚类树
T = cluster(Z2,6); % 建立聚类
H = dendrogram(Z2); %做出系谱图

最终聚类系谱图以下所示:
这里写图片描述

固然,MATLAB 也提供了 kmeans() 函数可供直接聚类使用,详情可参与其文档。