Scala实现:KD-Tree(k-dimensional tree)
kd-tree是一种分割k维数据空间的数据结构。主要应用于多维空间数据的搜索,经常使用在SIFT、KNN等多维数据搜索的场景中,以KNN(K近邻)为例,使用线性搜索的方式效率低下,k-d树本质是对多维空间的划分,其每个节点都为k维点的二叉树kd-tree,因此可以大大提高搜索效率。
KD-Tree的构建步骤:

上述文字引自李航博士的《统计学习方法》
以{(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)}数据集为例构建KD-Tree。
KD-Tree空间划分示意图如下:


关于三维数据的空间划分示意图如下所示

更多维度的数据划分只能靠脑补了······
KD-Tree最邻近搜索:
-
从根节点开始,递归的往下访问kd树,比较目标点与切分点在当前切分维度的大小,小于则移动到左子结点,大于则移动到右子结点,知道子结点为叶结点为止。
-
一旦移动到叶结点,将该结点当作"当前最邻近点"。
-
递归回退,对每个经过的叶结点递归地执行下列操作:
-
- 如果当前所在点比"当前最邻近点"更靠近输入点,则将其变为当前最邻近点。
-
- 当前最近点一定存在于该节点一个子结点对应的区域,检查另一子结点对应的区域是否与目标点为球心,以目标点与“当前最邻近点”之间的距离为半径的超球体相交:
- 1.如果相交,

本文介绍了一种在多维空间数据搜索中应用广泛的KD-Tree数据结构,并详细讲解了其构建与最近邻搜索的原理。提供了Scala语言实现的代码示例,包括树节点定义、KD-Tree创建、最近邻查找及K近邻查找算法。
最低0.47元/天 解锁文章
2489

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



