java knn kd树_KD树实现KNN

本文介绍了如何使用kd树进行K近邻搜索。详细阐述了kd树的构造和搜索算法,包括如何通过kd树找到目标点的最近邻,并给出了Python实现的kd树节点类和KNN模型。算法中利用优先队列进行k近邻搜索,当搜索到的点数量超过k时,会删除最远的点。
摘要由CSDN通过智能技术生成

最近在学习《统计学习方法》(李航著)。在第三章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队首结点”更近的点,移动到另一个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值