简单记录下kd树基本知识,使用kd树可很好的帮助实现k近邻法
一、概念
1、定义
kd树是一种对K维空间中的实例点进行存储以便对其进行快速检索的树形数据结构。
2、二叉树
Kd树是二叉树,表示对K维空间的一个划分。
3、几何意义
构造Kd树相当于不断地用垂直于坐标轴的超平面将k维空间切分,构成一系列的k维超矩形区域。
4、节点
Kd树的每个结点对应于一个k维超矩形区域.
二、构造
1、根节点
构造根结点, 使根结点对应于k维空间中包含所有实例点的超矩形区域;
2、子节点
通过下面的递归方法, 不断地对k维空间进行切分, 生成子结点。
在超矩形区域(结点)上选择一个坐标轴和轴上的一个切分点, 确定一个超平面。 这个超平面通过选定的切分点并垂直于选定的坐标轴, 将当前超矩形区域切分为左右两个子区域(子结点);
这时, 实例被分到两个子区域。
直到子区域内没有实例时终止(终止时的结点为叶结点)。
此过程中, 将实例保存在相应的结点上。
3、平衡
通常, 依次选择坐标轴对空间切分, 选择训练实例点在选定坐标轴上的中位数为切分点, 这样得到的kd树是平衡的。
4、构造算法
输入:数据集
输出:kd树
步骤
(1)开始 : 构造根结点, 根结点对应于包含T的k维空间的超矩形区域。
选择x(1) 为坐标轴, 以T中所有实例的x(1) 坐标的中位数为切分点, 将根结点对应的超矩形区域切分为两个子区域。 切分由通过切分点并与坐标轴x(1)垂直的超平面实现。
由根结点生成深度为1的左、 右子结点: 左子结点对应坐标x(1)小于切分点的子区域, 右子结点对应于坐标x(1)大于切分点的子区域。
将落在切分超平面上的实例点保存在根结点。
(2)重复 : 对深度为j的结点, 选择x(l)为切分的坐标轴, l= j(mod k) + 1,以该结点的区域中所有实例的 x(l)坐标的中位数为切分点, 将该结点对应的超矩形区域切分为两个子区域。 切分由通过切分点并与坐标轴x(l)垂直的超平面实现。
由该结点生成深度为j + 1的左、 右子结点: 左子结点对应坐标x(l)小于切分点的子区域, 右子结点对应坐标x(l)大于切分点的子区域。将落在切分超平面上的实例点保存在该结点
(3)停止
直到两个子区域没有实例存在时停止。 从而形成kd树的区域划分.
三、搜索(最近邻)
1、基本过程
给定一个目标点, 搜索其最近邻。
首先找到包含目标点的叶结点;
然后从该叶结点出发, 依次回退到父结点;
不断查找与目标点最邻近的结点, 当确定不可能存在更近的结点时终止。
这样搜索就被限制在空间的局部区域上, 效率提高明显。
2、详细过程
包含目标点的叶结点对应包含目标点的最小超矩形区域。
以此叶结点的实例点作为当前最近点。
目标点的最近邻一定在以目标点为中心并通过当前最近点的超球体的内部。
然后返回当前结点的父结点, 如果父结点的另一子结点的超矩形区域与超球体相交, 那么在相交的区域内寻找与目标点更近的实例点。
如果存在这样的点, 将此点作为新的当前最近点。
算法转到更上一级的父结点, 继续上述过程。
如果父结点的另一子结点的超矩形区域与超球体不相交, 或不存在比当前最近点更近的点, 则停止搜索
3、查找算法
输入: 已构造的kd树, 目标点x
输出 : x的最近邻
步骤
(1)在kd树中找出包含目标点x的叶结点: 从根结点出发, 递归地向下访问kd树。 若目标点x当前维的坐标小于切分点的坐标, 则移动到左子结点, 否则移动到右子结点。 直到子结点为叶结点为止。
(2)以此叶结点为“当前最近点” 。
(3)递归地向上回退, 在每个结点进行以下操作:
(a)如果该结点保存的实例点比当前最近点距离目标点更近, 则以该实例点为“当前最近点” 。
(b)当前最近点一定存在于该结点一个子结点对应的区域。 检查该子结点的父结点的另一子结点对应的区域是否有更近的点。 具体地, 检查另一子结点对应的区域是否与以目标点为球心、 以目标点与“当前最近点” 间的距离为半径的超球体相交。
如果相交, 可能在另一个子结点对应的区域内存在距目标点更近的点, 移动到另一个子结点。 接着, 递归地进行最近邻搜索;
如果不相交, 向上回退。
(4)当回退到根结点时, 搜索结束。 最后的“当前最近点” 即为力的最近邻点。



被折叠的 条评论
为什么被折叠?



