K近邻法

1. 模型概述
K近邻法对于给定的训练实例点和输入实例点,首先确定输入实例点的k个最近邻训练实例点,然后利用这k个实例点的类的多数来预测输入实例点的类别。
2. K近邻法三要素
距离度量
常用欧式距离或者更一般的L_p距离。
K值的选择
K值越小,模型越复杂,容易过拟合。K值过大,模型简单,丢失很多有用的信息。
分类决策规则
一般采用多数表决,对应于经验风险最小化。
3. Kd树的构建
K近邻法最简单的实现方法是线性扫描,但是如果特征空间维数很大或者样本容量很大,计算非常耗时,需要使用特殊的结构存储训练数据,以减少计算距离的次数。
kd树(kd tree)是其中的一种方法。构造kd树相当于不断地用垂直于坐标轴的超平面将k维空间划分,构成一系列的k维超矩形区域。
构造平衡kd树:
输入:k维空间数据集T={x_1,x_2,⋯,x_N },其中x_i=(x_i^((1)),x_i^((2)),⋯x_i^((k)) )^T,i=1,2,⋯,N;
输出:kd树。
构造根结点。
选择x^((1))为坐标轴,以T中所有实例的x^((1))坐标的中位数为切分点,将根结点对应的超矩形区域切分为两个子区域。
左子结点对应坐标x^((1))小于切分点的区域,右子结点对应于坐标x^((1))大于切分点的子区域。
将落在切分超平面上的实例点保存在根结点。
重复
对深度为j的结点,选择x^((l))为切分的坐标轴,l=j(modk)+1,以该结点的区域中所有实例的x^((l))坐标的中位数为切分点,将该结点对应的超平面矩形区域分为两个子区域。
由该结点生成深度为j+1的左右子结点:左子结点对应坐标x^((l))小于切分点的子区域,右子结点对应坐标x^((l))大于切分点的子区域。
将落在划分超平面上的实例点保存在该结点。
(3)指导看了两个子区域没有实例存在时停止。
用kd树的最近邻搜索
输入:已构造的kd树;目标点x;
输出:x的最近邻。
寻找包含目标点x的叶节点
从根结点出发,递归的往下访问kd树,如果目标结点x当前维小于切分点的坐标,则移动到左子结点,否则移动到右子结点,直到子结点为叶节点为止。
将此叶节点作为“当前最近点”
递归地回退,进行以下操作:
如果该结点保存的实例点比当前最近点更近,则以该实例点作为“当前最近点”。
检查该子结点的父结点的另一个子结点对应的区域是否有更近的点。具体地即检查另一子结点对应的区域是否与以目标结点为球心、以“当前最近点”距离为半径的超球体相交。如果相交,表明另一子结点对应的区域中可能存在距目标更近的点,移动到另一子结点上,接着递归地进行最近邻搜索。
如果不相交,向上回退。
当回退到根结点时,搜索结束。此时的“当前最近点”即为x的最近邻点。
如果实例点是随机分布的,则kd树的平均计算复杂度为Ο(log⁡N),N为训练实例数。kd树适于训练实例数远大于空间维数的k近邻搜索,当空间维数和训练实例数接近时,效率会迅速下降,几乎接近线性扫描。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值