基于KDTree的KNN实现

本文详细介绍了KNN算法以及KD树的构建和搜索过程。在KD树搜索中,从根节点递归找到包含目标点的叶子节点,并通过球体与子区域边界相交判断更新最近点。此外,还补充了二叉排序树和平衡二叉树的相关知识,强调了它们在查找效率上的优势。

1. KNN算法

K Nearest Neighbors 可用于分类问题,就是新样本和训练集的所有样本作对比,找出与之最接近的K个样本,统计最近的k个训练样本中所属类别计数最多的那个类,就是新样本的类。
该算法简单直观,但是每次查询都需要和所有样本进行比较,代价很大。一种优化方法是基于KD树的实现。

2. KD树

KD树是一个二叉树,表示对K维空间的一个划分,它的功能就是在高维空间下进行一个快速的最近邻查询。利用KD树可省去对大部分数据点的搜索,从而减少搜索的计算量。

2.1 KD树构建

构建KD树相当于不断地用垂直于坐标轴的超平面将K维空间进行划分,构成一系列的K维超矩形区域,KD树的每一个节点对应于一个K维超矩形区域。
通常依次选择坐标轴对空间进行切分,选择训练样本在选定坐标轴上的中位数为切分点,这样得到的KD树是平衡的。但是,平衡的KD树搜索时的效率未必是最优的。也有选择 熵最大的特征值进行切分,个人感觉这里更有理由,因为熵越大,说明样本在这一维度上信息越大,切分后效果会越好。

2.2 KD树搜索


记待查询点的样本点为Q,样本点为xi,样本维度为d,即xi = {a1, a2, ..., ad}
  1. 首先从根节点开始递归往下找到包含Q的叶子节点,每一层都是找对应的xi;
  2. 将这个叶子节点认为是当前的“近似最近点”;
  3. 递归向上回退,如果以Q圆心,以“近似最近点”为半径的球与根节点的另一半子区域边界相交,则说明另一半子区域中存在与Q更近的点,则进入另一个子区域中查找该点并且更新”近似最近点“;
  4. 重复3的步骤,直到另一子区域与球体不相交或者退回根节点;
  5. 最后更新的”近似最近点“与q真正的
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值