KD树
KD树种k指的是空间维度,和knn中的k值代表含义不同
举例数据维度只有2维,所以可以简单地给x,y两个方向轴编号为0,1,也即split={0,1}。
(1)确定split域的首先该取的值。分别计算x,y方向上数据的方差得知x方向上的方差最大,所以split域值首先取0,也就是x轴方向;
(2)确定Node-data的域值。根据x轴方向的值2,5,9,4,8,7排序选出中值为7,所以Node-data = (7,2)。这样,该节点的分割超平面就是通过(7,2)并垂直于split = 0(x轴)的直线x = 7;
(3)确定左子空间和右子空间。分割超平面x = 7将整个空间分为两部分,如图2所示。x < = 7的部分为左子空间,包含3个节点{(2,3),(5,4),(4,7)};另一部分为右子空间,包含2个节点{(9,6),(8,1)}。
如算法所述,k-d树的构建是一个递归的过程。然后对左子空间和右子空间内的数据重复根节点的过程就可以得到下一级子节点(5,4)和(9,6)(也就是左右子空间的'根'节点),同时将空间和数据集进一步细分。如此反复直到空间中只包含一个数据点,如图1所示。最后生成的k-d树如图3所示。
K最近邻搜索
给定一个目标点,搜索其最近邻,首先通过二分搜索,顺着“搜索路径”很快能找到最近邻的近似点,也就是与目标点处于同一个子空间的叶子结点;然后从该叶子结点回溯,并判断搜索路径上的结点的其他子结点空间中是否可能有距离查询点更近的数据点,如果有可能,则需要跳到其他子结点空间中去搜索,并将其他子结点加入到搜索路径。重复这个过程直到搜索路径为空。这样搜索就被限制在空间的局部区域上了,提高了搜索效率。
包含目标点的叶节点对应包含目标点的最小超矩形区域。以此叶节点的实例点作为当前最近点。目标点的最近邻一定在以目标点为中心并通过当前最临近点的超球体的内部,然后返回当前结点的父节点,如果父节点的另一子节点的超矩形区域与超球体相交,那么在相交的区域内寻找与目标点更近的实例点。如果存在这样的点,将此点作为新的当前最近点。算法转到更上一级的父节点,继续上述过程。如果父节点的另一子节点的超矩形区域与超球体不相交,或不存在比当前最近点更近的点,则停止搜索。
KD树适用于训练实例数目远大于空间维数时候的k近邻搜索。
posted on 2017-11-23 15:50 WegZumHimmel 阅读(138) 评论(0) 编辑 收藏 举报