【k近邻】 K-Nearest Neighbors算法原理及流程
【k近邻】 K-Nearest Neighbors算法距离度量选择与数据维度归一化
Kd树是一种对K(与k近邻的k意义不同)维空间中的实例点进行存储以便对其进行快速检索的树形数据结构。
Kd树是一种二叉树,表示对K维空间的一个划分(partition)。
构造Kd树相当于不断地用垂直于坐标轴的超平面将K维空间切分,构成一 系列的K维超矩形区域。Kd树的每个结点对应于一个k维超矩形区域。
算法:构造kd树
输入:维空间数据集,其中
输出:树。
(1)开始:构造根结点,根结点对应于包含T 的维空间的超矩形区域。
选择为坐标轴,以中所有实例的 终标的中位数为切分点,将根结点对应的超矩形区域切分为两个子区域。切分由通过切分点并与坐标轴垂直的超平面实现。
由的根结点生成深度为1的左,右子结点:左子结点对应坐标小于切分点的子区域,右子结点对应于坐标大于切分点的子区域。
将落在切分超平面上的实例点保存在根结点。
(2)重复:对深度为的结点,选择为切分的坐标轴,,以该结点的区域中所有实例的坐标的中位数为切分点,将该结点对应的超矩形区域切分为两个子区域。切分由通过切分点并与坐标轴垂直的超平面实现。
由该结点生成深度为的左、右子结点:左子结点对应坐标小于切分点的子区域,右子结点对应坐标大于切分点的子区域。
将落在切分超平面上的实例点保存在该结点。
(3)直到两个子区域没有实例存在时停止,从而形成树的区域划分。
例:沿x轴开始的kd树构造
算法:使用kd树的最近邻搜索
输入:已构造的 树,目标点
输出:的最近邻。
(1)在树中找出包含目标点的叶结点:从根结点出发,递归地向下访问树。若目标点当前维的坐标小于切分点的坐标,则移动到左子结点,否则移动到右子结点。直到子结点为叶结点为止。
(2)以此叶结点为“当前最近点”。
(3)递归地向上回退,在每个结点进行以下操作:
(a)如果该结点保存的实例点比当前最近点距离目标点更近,则以该实例点为“当前最近点”。
(b)当前最近点一定存在于该结点一个子结点对应的区域。检查该子结点的父结点的另一子结点对应的区域是否有更近的点。具体地,检查另一子结点对应的区域是否与以目标点为球心、以目标点与“当前最近点”间的距离为半径的超球体相交。
如果相交,可能在另一个子结点对应的区域内存在距目标点更近的点,移动到另一个子结点。接着,递归地进行最近邻搜索;
如果不相交,向上回退。
(4)当回退到根结点时,搜索结束。最后的“当前最近点”即为的最近邻点。