最近在学习《统计学习方法》(李航著)。在第三章K近邻法中,先一如既往地从统计学习的三要素(模型、策略、算法)介绍了k近邻法,接着讲述k近邻法的一个具体实现方法-kd树,包括kd树的构造和kd树的搜索。
但是,在kd树搜索部分,书中只给出了使用kd树进行最近邻搜索(NNS)的算法描述,而使用kd树进行k近邻搜索的算法描述被留作课后习题。
对于本书第三章课后习题中3.3使用kd树进行k近邻搜索的算法及实现,网上鲜有描述(可能是太简单了o_O)。
本文尝试对此题借助优先队列进行解答:
算法(用kd树的k近邻搜索)
•输入:已构造的kd树;目标点x;k值;
•输出:x的最近邻
•算法过程:构造优先队列L(最大优先队列,距离从小到大的顺序排队)
在树中找出包含目标点x的叶结点:从根结点递归访问kd树,若x当前维的坐标小于切分点的坐标,则移动到左子结点,否则移动到右子结点,直到子结点为叶结点
将此节点插入队列L,如果L长度大于k,则获取并删除队首元素
递归地向上回退,在每个结点进行以下操作
(a) 如果该结点保存的实例点比L队首更近,则将此节点插入队列L,如果L长度大于k,则获取并删除队首元素
(b) 检查该子结点的父结点的另一子结点对应的区域是否有比L队首更近的点。
具体地,检查另一子结点对应的区域是否与以“L队首结点”为球心、以目标点与“L队首结点”间的距离为半径的超球体相交
如果相交,可能在另一个子结点对应的区域内存在距离“L队首结点”更近的点,移动到另一个