k近邻算法的实现:kd树

    k近邻算法最简单的实现方法是线性扫描。但当训练集很大时,搜索效率低,为了提高效率,可构建kd树。

一、构建kd树

    以中位数作为切分点得到的kd树时平衡树。kd树本身是一个二叉树,对特征空间进行划分。

    算法:输入:数据集T

                输出:kd树

            1.构造根节点,选择第一个特征为坐标轴,然后只考虑第一个特征,对所有实例的第一个特征的值进行排序,找出中位数,并由此作为切分点,将数据集划分为两大部分。(将落在切分超平面的点即中位数对应点放在结点上)。

            2.重复:依次对各个坐标轴进行切分,再从第一个坐标轴循环切分。

            3.结束:直至两个子区域没有实例存在时停止。

            二维的切分可以如下图:

                    

二、搜索kd树

    构建好kd树看起来是个冗余的过程,但是构建完成之后,对特例点进行找寻邻近点时就会大大提高效率。类似于linux命令的locate和find命令。

    利用kd树进行最近邻搜索:

            输入:已构造的kd树,目标点x

            输出:x的最近邻

            步骤:1.在kd树中找出包含目标点x的叶节点。

                        2.以此叶结点作为当前最近点。

                        3.递归向上回退,对每个结点进行操作:

                            如果该结点保存的实例点比当前最近点距离近,更新最近点为此结点。

                            检查该子节点的父节点的另一子节点对应区域是否有更近点。如果有,更新。

                            接着,递归向上进行搜索。

                        4.当回退到根结点时,搜索结束。

kd树搜索的平均计算复杂度时O(logN)。

kd树更适用于训练示例数远大于空间维数时的k近邻搜索。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值