k-means算法为常见的聚类算法。
算法的大致思路为:
首先指定要分多少类(k),然后指定k个类中心点的初始坐标。
线性扫描所有的点,计算其至各中心点的距离,选择最小距离使自己归于此类。然后更新各个类中心点的坐标。
迭代上述步骤直至达到收敛条件。
伪码如下:
但是,k初始以及中心点坐标初始值的随机选定可能会对结果造成影响。
k初始值我们可以采用手肘法:
(图片取自知乎@是泽哥啊)
取每个点至其所在类中心点的总距离,然后取其拐点(3)。
还可以采用蒙特卡洛模拟,自动取得k值。
解决随机选取中心点的坐标的问题可以采用**k-means++**算法。
但是,每次都要线性扫描所有的比较耗时。
为了提高效率,我们可以采用kd树。
kd树即在n维空间(坐标为n维时),以垂直于坐标轴的方法进行空间切分。且切分位置为其坐标的中位数,如下图所示:
kd树为二叉树,初始时,二叉树的根节点为整个坐标空间,然后左右子树为被其切分的两个区域,重复,直到切分到区域中没有坐标点为止。
来源:CSDN
作者:JLUspring
链接:https://blog.csdn.net/qq_37724465/article/details/103834700