kNN算法每次在查询k个最近邻的时候都需要遍历全集才能计算出来,可想而且如果训练样本很大的话,代价还是很大的
优化:kd tree
该树的功能就是在高维空间下进行一个快速的最近邻查询。
构造的kd树如下
利用kd树搜索最近邻
输入:已构造的kd树;目标点x;
输出:x的最近邻
1.在kd树中找出包含目标点x的叶结点:从根结点出发,递归的向下访问kd树,若目标点x的当前维的坐标小于切分点的坐标,则移动到左子结点,否则移动到右子结点,直到子结点为叶结点为止。
2.以此叶结点为“当前最近点”
3.递归地向上回退,在每个结点进行以下操作:
(a)如果该结点保存的实例点比当前最近点距离目标点更近,则以该实例点为“当前最近点”;
(b)当前最近点一定存在于某结点一个子结点对应的区域,检查该子结点的父结点的另
一子结点对应区域是否有更近的点(即检查另一子结点对应的区域是否与以目标点为球
心、以目标点与“当前最近点”间的距离为半径的球体相交);如果相交,可能在另一
个子结点对应的区域内存在距目标点更近的点,移动到另一个子结点,接着递归进行最
近邻搜索;如果不相交,向上回退
4.当回退到根结点时,搜索结束,最后的“当前最近点”即为x的最近邻点。