K-means聚类算法
简介(百科)
K-means算法是硬聚类算法,是典型的基于原型的目标函数聚类方法的代表,它是数据点到原型的某种距离作为优化的目标函数,利用函数求极值的方法得到迭代运算的调整规则。K-means算法以欧式距离作为相似度测度,它是求对应某一初始聚类中心向量V最优分类,使得评价指标J最小。算法采用误差平方和准则函数作为聚类准则函数。
原理
K-means算法的原理,简单来说,比如有一堆数据点,在这堆数据点中寻找聚集在一起的点。
如下图:
整个过程就是寻找红绿蓝三堆数据点的重心。那么,怎么寻找呢?
很简单,可以随便找三个点当做重心点,根据这三个点可以确定出三堆距离这三点距离最近的数据集合,然后有了这三个集合就可以确定集合里的重心,再重复这个过程,最终肯定会找到我们需要的重心位置,并且之后的迭代,重心就不会发生太大的变化。
上述表述很啰嗦,用数学公式就可以很简单的表示出来:
u就是我们过程中的那个重心,S就是上述的数据堆,也就是你分好的集合,x就是该集合的各个点。最后算出的V肯定会收敛在一个极限值里。不收敛就再确定重心,再算V,直到收敛为止。
说明
首先,很重要的一点是需要分成几个S,也就是确定K值,通过我们直观的看,如上图,很容易就确定出有三个S,但是在程序使用中,可能无法直观看出需要几个S,或者程序自动执行时,读入不同的数据,就要对应不同的S。
在论文中有很多确定S的分析方法,这里不做介绍,因为我的研究集中在点云的处理,这里说下点云处理中是如何确定S的。
在点云处理中,K-means是用来精简点云数据的,也就是将属于同一类中的数据删除,只保留重心点,这样既可以做到保留特征点的前提下,精简数据,而K值,对应的就是精简比例,K值越大,保留的重心就越多,反之,保留的就少,至于要保留多少,看使用者的设置,但是,一般会根据点云集合数据的量和所精简对象的复杂度来确定。