K-Means算法(思想)

来源:互联网 发布:常州海智软件 编辑:程序博客网 时间:2024/06/05 18:35


K-Means算法的思想:

第一步:寻找最近的中心点

在给定的数据集上随机选取K(K已知)个点(向量)作为数据集上的K个中心(也就代表K个类别),然后依次遍历每一条数据,分别计算其与K个中心的距离,选择与之距离最近的点作为该数据所属的类别。这样一次遍历完之后,数据集中的所有点都被划入了其应该所属的类别里面(尽管有划错的)。

注意:初始中心点的选择,会影响到最终的分类结果,即可能不会收敛

第二步:重新计算中心

对于每一个类别来说,里面都有若干个点。由于之前的中心点事随机选取的,所以可定有不合理的中心点,于是我们就要重新计算中心点。然后再重复进行第一步的操作。

经过多次迭代前面两个步骤之后,最终的总代价将会收敛到一个最小值。此时的得到的聚类结果通常也就是最好的。


详细步骤:

现有如下数据集,欲将其分为3类,即K=3:

这里写图片描述

1.寻找最近的中心点

先随机取3个点μ1,μ2,μ3作为中心点,然后分别计算每个点到μ1,μ2,μ3的距离的平方(平方在计算的时候好处理,不含根号),选择最小的。其中,μ为一个K×n矩阵,用来记录K个中心点坐标。

比如现在有一个点xi,其到μ1,μ2,μ3的距离分别为s1,s2,s3s2最小,那么我们就将xi这个点划入到第二个类别,即c(i)=2。其中,c为一个m维的列向量,用来记录每一个数据xi所属对应的类别。

这样依次遍历完所有的点,将其划入对应的类别中。

2.重新计算中心点

上面也说到,初始化的中心点(如下图中的3个叉)肯定不会是最佳的点,所以要对其重新多次计算,直到代价值收敛。

这里写图片描述

如上图所示,数据集对应的被聚类成了三个部分(三种颜色标注的),但显然很不好。所以就要在这基础上重新计算中心点。

比如现在μ1这个类中有x1,x3,x6,x8,x12,5个点那么重新计算后的中心点:

μ1=x1+x3+x6+x8+x125
(分子为向量的加法)

3.迭代

反复迭代以上两步,使代价函数收敛。

这里写图片描述

这里写图片描述

这里写图片描述

从上图可以看出,大概迭代到底6次后,中心点也就没有再发生变化了。也就是说此时代价函数已经收敛了。代价值为所有点,到其对应中心点的距离之和。

J(c,μ)=1mi=1m||x(i)μc(i)||2


其中:

xi表示数据集中的每一点;
μc(i)表示xi所属的中心点;

这里写图片描述

实例,戳此处

原创粉丝点击