我做了一个小例子,将k-means算法用在我最近做的一个系统中。以下介绍k-means算法。
(1)k-means算法的简介
本系统使用k-means算法来计算一维数据的聚集程度,实现圈子的划分,这里的一维数据是所有的点,用A、B、C、D来表示每一个点,任意两个点之间的最短距离的计算方法已经封装成为接口,直接调用即可。K-Means算法的基本思想是初始随机给定K个簇中心,按照最邻近原则把待分类样本点分到各个簇。然后重新计算各个簇的质心,从而确定新的簇心。一直迭代,直到簇心不再发生改变为止,算法结束。
(2)k-means算法的设计思想
如图所示,图中共有5个点,分别是A、B、C、D、E,灰色的点是种子点,也就是用来找点群的点,因为有两个种子点,所以k=2.
(3)k-means算法的具体步骤
如上图所示,随机在图中取K(这里K=2)个种子点。
①然后对图中的所有点求到这K个种子点的距离,假如点Pi离种子点Si最近,那么Pi属于Si点群。(上图中,可以看到A,B属于上面的种子点,C,D,E属于下面中部的种子点)。
②接下来,需要移动种子点到属于他的“点群”的中心。(见图上的第三步)
③然后重复第2)和第3)步,直到,种子点没有移动(可以看到上图中的第四步上面的种子点聚合了A,B,C,下面的种子点聚合了D,E)。
我做的例子中对于k-means的应用具体步骤:
①随机在数据库中取K个种子点,一般情况下,取数据库所存储数据的前n个数据作为初始种子点。
②然后对数据库中的所有点求到这K个种子点的距离,假如点Pi离种子点
Si最近,那么Pi属于Si点群。这样就将所有点划分成了k个圈子。
③接下来,要移动种子点到属于他的“点群”的中心,移动思路是使得点群中所有点到中心点的距离之和最短,我们将这个中心点称点群的中心。求最短距离之和的过程中,本系统使用了Dijkstra算法,将求某个点到其余所有点的最短距离之和的过程写成了接口,返回更新后的种子点和最短距离之和。
④然后重复第(2)和第(3)步,直到,种子点不再发生变化。则分圈结束。
(4)k-means算法的流程图
(5)k-means算法的结果测试:
本系统设定将所有的点分成三个圈子,程序总共循环分圈了两次,进行两次分圈之后,中心点不再发生变化,于是程序停止运行。