根据模型的数学原理进行简单的代码自我复现以及使用测试,仅作自我学习用。模型原理此处不作过多赘述,仅罗列自己将要使用到的部分公式。
如文中或代码有错误或是不足之处,还望能不吝指正。
某些机器学习模型,如KNN,中,需要在n维空间上计算距离,找到训练样本中距离自身最近的那一个点。如果直接计算距离,就需要O(n²)的时间复杂度。故而需要引入KD树作为索引,以此搜索最近距离的点。
KD树的大致原理,就是在每一层中,根据剩余数据集中方差最大的特征排序,选取正中间的点作为节点值,将左右两边的值分别构建左右子树。
在搜索时,
1 首先从根节点开始,根据当前节点的分割特征判断像左还是向右移,直至达到叶子节点。
2 将叶子节点作为“最近点”,并从叶子节点开始向前回溯,计算到此节点距离是否更小。是的话替代
3 在回溯过程的同时,还需要与当前节点的父节点进行比较:如果点到父节点对应所在的(超)平面(也就是父节点分割依据的那个特征所在平面)距离小于到当前节点的2点的距离, 那么就代表目标点其兄弟节点的距离有可能更短,应当从其兄弟节点处重新执行1~3步。
这里其实很好理解,因为目标点到平面的距离是垂直的最短距离,如果点到当前节点的距离比这个距离小,那么在平面上的其他节点也会小于这个距离。但是点到当前节点的距离比垂直距离更大时,那么兄弟节点就有可能成为那个“距离更小的节点”。
import numpy as np
from collections import deque
class Node:
def __init__(self,value=None,split=None,left=None,right=None,father=None):
self.value = value
self.split = split
self.left = left
self.right = right
self.father = father
class KDTree:
def __

本文介绍了如何使用KD树进行高效的K近邻(KNN)搜索。KD树是一种数据结构,用于在高维空间中快速查找最近邻。通过在每个维度上选择方差最大的特征进行分割,KD树可以将搜索复杂度降低到O(log n)。在构建KD树后,文章详细解释了搜索最近邻的步骤,包括从叶子节点开始回溯,以及在回溯过程中考虑父节点和兄弟节点的影响。此外,还给出了搜索K个最近邻的算法思路。最后,通过使用numpy生成随机数据进行了初步验证。
最低0.47元/天 解锁文章
2万+

被折叠的 条评论
为什么被折叠?



