KD树的实现

本文介绍了KD树在KNN算法中的作用,详细阐述了KD树的建立和搜索过程,并提供了Python代码实现。通过KD树,可以提高寻找最近邻的效率,对比暴力求解,KD树显著提升了搜索速度。
摘要由CSDN通过智能技术生成

在我们使用KNN算法分类时,需要求离某个点最近的k个样本。如果用矩阵来储存计算的话,则大大降低效率,因此我们使用KD树进行储存与搜索。

KD树的建立:(转发自https://zhuanlan.zhihu.com/p/23966698

 KD树的搜索:(来源自【数学】kd 树算法之详细篇 - 知乎,中间的小问题略有修改)

给定一个构建于一个样本集的 kd 树,下面的算法可以寻找距离某个点 p 最近的 k 个样本。

零、设 L 为一个有 k 个空位的列表,用于保存已搜寻到的最近点。
一、根据 p 的坐标值和每个节点的切分向下搜索(也就是说,如果树的节点是照  进行切分,并且 p 的 r 坐标小于 a,则向左枝进行搜索;反之则走右枝)。


二、当达到一个底部节点时,将其标记为访问过。如果 L 里不足 k 个点,则将当前节点的特征坐标加入 L ;如果 L 满并且当前节点的特征与 p 的距离小于 L 里最长的距离,则用当前特征替换掉 L 中离 p 最远的点。


三、如果当前节点不是整棵树最顶端节点,执行 (a);反之,输出 L,算法完成。


a. 向上爬一个节点。如果当前(向上爬之后的)节点未曾被访问过,将其标记为被访问过,然后执行 (1) 和 (2);如果当前节点被访问过,再次执行 (a)。


1. 如果此时 L 里不足 kk 个点,则将节点特征加入 L;如果 L 中已满 k 个点,且当前节点与 p 的距离小于 L 里最长的距离,则用节点特征替换掉 L 中离最远的点。


2. 计算 p 和当前节点切分线的距离。如果该距离大于等于 L 中距离 p 最远的距离并且 L 中已有 k 个点,则在切分线另一边不会有更近的点,执行 (三);如果该距离小于 L 中最远的距离或者 L 中不足 k 个点,则切分线另一边可能有更近的点,因此在当前节点的另一个枝从 (一) 开始执行。

 下面我们用代码进行实现:

import numpy as np
class kdnode(object):
    #树结点
    def __init__(self,dom_elt,split,left,right,target):
        self.dom_elt=dom_elt #数据
        self.split=split #切分维度
        self.left=left
        self.right=right
        self.case=0#0表示还未被访问
        self.label=target

class kdtree(object):
    #根据数据创建一个kd树
    def __init
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值