python-k近邻算法-kd树

KNN算法

"""
KNN算法
    即K最邻近算法,用于搜索K个最近邻居的算法,--最简单机器学习算法之一
    当某一个模型T的周围的K个模型中大多数都是某一类G,则T也划分为G类

k-d树:(K-Dimension tree)
    是对数据点在k维空间(2维(x,y) 3维(x,y,z) k维(a,b,c...k))中划分的一种数据结构
    主要应用与多维空间关键数据的搜索--范围搜索和最近邻搜索
本质:
    一颗二叉查找树,时间复杂度O(log₂N)
    
存储流程:
    在存储k维数据时,k-d树的第n层(根节点为第一层)使用第n%k(取余数)维度数据作为二叉树左右节点的存储数据
例如:
    要存储一个三维数据(4,2,6) 4 是第一维度 2是第二维度 6是第三维度
    若该数据需要被村道第四层,因为4%3=1 所以使用第一维度的4 作为左右节点的存储依据
    
要搜索距离点(a,b)最近的K个近邻,D用于存储搜索到的近邻点
查找流程:
    1. 从根节点出发, 依次比较当前节点和点(a,b)第n%2维度数据,向左子结点或右子节点搜索
        直到搜索到叶节点(n为层数)
    2. 将经过的节点标记为已访问,并判断D中存储的数据数量是否小于K,若小于K,则将该叶节点
        存入D, 否则计算该叶节点到点(a,b)的距离, 若大于D中的任何一个点到点(a,b)的距离,
        则删除D中距离最大的点,然后将该叶节点存入D中
    3. 回溯其父节点和父节点的另一个子节点重复 1 和 2 直到某个父节点的距离已经大于D中最大的距离,搜索结束
"""


class KDNode():
    """
    k-d树的节点
    """

    def __init__(self, point=None, split=None, leftNode=None, rightNode=None):
        self.point = point
        self.leftNode = leftNode
        self.rightNode = rightNode
        # 划分维度 当前节点是通过哪一个维度来划分
        self.split = split

    def __str__(self):
        return f'point={
     self.point}'


class KDTree():
    def __init__(self, data_list):
        # k-d算法维度
        self.dimension = len(data_list[0])
        self.root = self.createKDTree(data_list)

    def createKDTree(self, data_list, n=0):
        """
        将列表数据构建成k-d树
        :param data_list:
        :param n:
        :return:
        """
        length = len
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值