K-means算法原理以及java实现

本文介绍了K-means算法的基本概念、设计思想,并通过一个实例详细阐述了该算法的具体步骤和流程,展示了在Java中如何实现K-means算法进行特征点聚类。在示例中,算法将点分为三个类别,经过两次迭代,中心点稳定,完成了聚类过程。
摘要由CSDN通过智能技术生成

我做了一个小例子,将k-means算法用在我最近做的一个系统中。以下介绍k-means算法。

(1)k-means算法的简介

本系统使用k-means算法来计算一维数据的聚集程度,实现圈子的划分,这里的一维数据是所有的点,用A、B、CD来表示每一个点,任意两个点之间的最短距离的计算方法已经封装成为接口,直接调用即可。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属于上面的种子点,CDE属于下面中部的种子点)。
②接下来,需要移动种子点到属于他的“点群”的中心。(见图上的第三步)
③然后重复第2)和第3)步,直到,种子点没有移动(可以看到上图中的第四步上面的种子点聚合了A,B,C,下面的种子点聚合了DE)。

我做的例子中对于k-means的应用具体步骤:

①随机在数据库中取K个种子点,一般情况下,取数据库所存储数据的前n个数据作为初始种子点。
②然后对数据库中的所有点求到这K个种子点的距离,假如点Pi离种子点  
   Si最近,那么Pi属于Si点群。这样就将所有点划分成了k个圈子。
③接下来,要移动种子点到属于他的“点群”的中心,移动思路是使得点群中所有点到中心点的距离之和最短,我们将这个中心点称点群的中心。求最短距离之和的过程中,本系统使用了Dijkstra算法,将求某个点到其余所有点的最短距离之和的过程写成了接口,返回更新后的种子点和最短距离之和。
④然后重复第(2)和第(3)步,直到,种子点不再发生变化。则分圈结束。       

(4)k-means算法的流程图

这里写图片描述

(5)k-means算法的结果测试:
本系统设定将所有的点分成三个圈子,程序总共循环分圈了两次,进行两次分圈之后,中心点不再发生变化,于是程序停止运行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值