机器学习模型自我代码复现:KD树

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

根据模型的数学原理进行简单的代码自我复现以及使用测试,仅作自我学习用。模型原理此处不作过多赘述,仅罗列自己将要使用到的部分公式。

如文中或代码有错误或是不足之处,还望能不吝指正。

某些机器学习模型,如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 __
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值