在用聚类算法如k-means对数据进行聚类处理的时候,按照一般的处理方法,需要将每个数据跟其他所有的元素进行比较,计算相似度,然后才能聚类。
假定有N个元素,则需计算N*(N-1)/2 次,当N非常大的时候,则非常消耗时间,这种时候,可以使用K-d树数据结构,对所有数据进行重新组织,构成一棵而叉树。
k-d树的构建,最典型的方法如下:
- 随着树的深度轮流选择轴当作分区面。(例如:在三维空间中根节点是 x 轴垂直分区面,其子节点皆为 y 轴垂直分区面,其孙节点皆为 z 轴垂直分区面,其曾孙节点则皆为 x 轴垂直分区面,依此类推。)
- 点由垂直分区面之轴座标的中位数区分并放入子树
例如有一个20个数据的数据集,每个数据都是一个3维的向量(x,y,z)。在构建k-d树的时候,第一轮,先查看所有数据x的值,取20个x的中位数,将所有数据切分成2个集合,然后分别对两个集合进行处理,取每个集合中元素y的值的中位数,将每个集合进行切割,最后对所得集合进行第三轮处理,每个集合取所有z的值的中位数,对集合进行切割。每次切割,比中位数小的节点构成一个集合,比中位数大的节点构成一个集合。最终这些集合构成一个二叉树。
k-d树最邻近搜索的过程如下:
- )从根节点开始,递归的往下移。往左还是往右的决定方法与插入元素的方法一样(如果输入点在分区面的左边则进入左子节点,在右边则进入右子节点)。
- )一旦移动到叶节点,将该节点当作"目前最佳点"。
- )解开递归,并对每个经过的节点运行下列步骤:
-
(1) 如果目前所在点比目前最佳点更靠近输入点,则将其变为目前最佳点。
(2) 检查另一边子树有没有更近的点,如果有则从该节点往下找
- 当根节点搜索完毕后完成最邻近搜索