基于KDTree的KNN实现

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. 将这个叶子节点认为是当前的“近似最近点”;
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值