k-means概念
K-Means算法是无监督的聚类算法 ,也是一个比较简单的聚类算法,效果明显。
例如在二维平面上,存在以下点,点的类别未知

通过k-means算法,可以得到以下三个簇。使用不同颜色标注出,点集被分为3个类别。

算法思想
现有样本集X,包含m个样本,每个样本n个特征
X=⎣⎢⎢⎡x11x21...xm1x12x22...xm2............x1nx2n...xmn⎦⎥⎥⎤
其中第i个样本为
xi=[xi1xi2...xin]
假设我们要把数据分成K个类,可以分为以下几个步骤:
k为人为设定
1. 随机选取k个点,作为聚类中心;
R=⎣⎢⎢⎡r11r21...rk1r12r22...rk2............r1nr2n...rkn⎦⎥⎥⎤,rij随机选取
其中第i个聚类中心为
ri=[ri1ri2...rin]
2. 计算每个点分别到k个聚类中心的距离,然后将该点分到最近的聚类中心;
dist(xi,R)=dist([xi1xi2...xin],⎣⎢⎢⎡r11r21...rk1r12r22...rk2............r1nr2n...rkn⎦⎥⎥⎤)=⎣⎢⎢⎡d1d2...dk⎦⎥⎥⎤
其中:
d1=(xi1−r11)2+(xi2−r12)2+...+(xin−r1n)2
d2=(xi1−r21)2+(xi2−r22)2+...+(xin−r2n)2....
每个样本与k个中心计算,得到k个距离
取距离最近的中心,其所对应的类别。l=getGroup(min(d1,d2,...,dk))
将该样本类别设置为l
3. 重复步骤2直到所有点完成分类
4. 重新计算每个簇的质心(均值);
当所有样本分类完成,分为了k个类别(簇)后
l1:m1个样本l2:m2个样本...lk:mk个样本
分别求各个簇中样本的均值,将簇的质心变为该均值
5. 重复以上2~4步,直到质心的位置不再发生变化或者达到设定的迭代次数;