Kmeans算法是一种极为常见的聚类算法。
其算法过程大意如下:
(1)通过问题分析,确定所要聚类的类别数k;(一般是难以直接确定,可以使用交叉验证法等方法,逐步进行确定。)
(2)根据问题类型,确定计算数据间相似性的计算方法;
(3)从数据集中随机选择k个数据作为聚类中心;
(4)利用相似度计算公式,计算每个数据与聚类中心之间的相似度。选择相似度最大的聚类中心,作为该数据点所归属的类。
(5)利用(4)以确定每个数据点的类别,重新计算每一类新的聚类中心;
(6)重复步骤(4)和(5),直到所有聚类中心稳定或者达到之前所设定的停止要求(例如,小于数据类别变化的阈值)。
Kmeans聚类在数据量较小的情况下,可以表现出较好的结果。但是,在数据量较大,并且每个数据的特征维度较高的情况下,执行Kmeans聚类将是极为耗费代价的。因为,每一次聚类过程都是需要计算整个数据空间的。计算量为nxk。其中,n为数据个数,k为聚类类别数。为此,可以通过构建一种较为复杂的数据结构(KD树)来减少每次聚类的搜寻。
对于KD树知识点的讲解可以分为三个方面:1.KD树的构建;2.KD树的修改;3.KD树在Kmeans聚类中的使用。
1.KD树的构建:
(1)利用(k%j+1)=i来选择第k次计算的数据维度号;(其中%为mod运算。)
(2)计算数据第i维的中位数,把其所对应的数据作为此时数据集的划分中心;
(3)利用该划分中心,将数据集一分为二;然后再对数据集进行重复步骤(1)和(2),直到不能再划分为止。
利用该方法就可以构建一棵二叉树,这就是KD树。(这里备注,一直不明白KD树名字的由来。只是知道K是指每个数据都有k个特征维度。)
2.KD树的修改:
KD树的修改包括:KD树节点的插入和KD树节点的删除(备注,KD树的修改,其实在Kmeans聚类算法里面没有多大用处,这里只是稍微提一下,权当是学习了。)。
KD树的插入在查找过程有点类似于二叉搜索树,在插入之后,则是使用二叉平衡树在插入之后的修正方法,进行修正。
根据之前建树时,所选定的比较轴顺序,进行比较对应维度的数据的大小,来选择该数据所走的方向。直到空指针出现时,就可以知道所要插入的位置。但是只是这样插入,必然会破坏了KD树,所以需要一定的修正。而这个修正类似于二叉平衡树在插入新节点之后对树的修正。
3.KD树在Kmeans算法中的使用
如果单纯执行Kmeans算法,则每一次聚类都需要遍历空间内的所有数据,这样对数据维度较大,数据量较大的情况,所耗费的代价是极大的。对此,我们需要使用KD树让Kmeans数对数据的搜索可以再局部中进行。
对KD树的查找,我们更经常使用的是使用其查找最近邻的数据。但是,如果是K个最近邻的数据,又该如何?是找到最近邻之后,忽视最近邻,然后再找次最近邻。