最近邻搜索非度量空间

时间:2017-09-03 07:13:35

标签: computational-geometry nearest-neighbor kdtree

我想知道在非度量空间中工作时最近邻搜索算法?特别是,在此设置中是否存在kd-tree算法的任何变体,具有可证明的时间复杂度等?

2 个答案:

答案 0 :(得分:0)

NMSLIB提供了一个用于在非度量空间中执行最近邻搜索的库。 Github页面提供了十几篇要阅读的论文,但并非所有论文都适用于非度量空间。

不幸的是,关于非度量空间的Neaest邻居搜索的复杂性的理论结果很少,并且没有全面的实证评估。

我可以在Effective Proximity Retrieval by Ordering Permutations看到一些理论结果,但我不相信。不过,我建议你看看。

似乎没有多少人使用k-d树作为非度量空间。他们似乎使用VP树等,也使用了密度,如Near Neighbor Search in Nonmetric Spaces中所述。

直观地说,密度树是一类装饰树,它以类似于metric tree的方式保存数据集的点。关键的区别 在于树木装饰的本质;而不是有一个或几个实数值反映附加到每个树节点的三角不等式的某些边界,每个密度节点都与一个称为密​​度估计器的特定分类器相关联。

答案 1 :(得分:0)

可能对您有更多理论上的兴趣: PH-Tree类似于四叉树,但是,在存储它们之前,它会将浮点坐标转换为非度量系统。 PH-Tree使用非度量距离函数对非度量数据执行所有查询(包括kNN查询)(您可以在其上定义自己的距离函数)。

就kNN而言,PH-Tree与R + Trees等树木相当,并且通常优于kd-tree。 非度量数据存储似乎对性能几乎没有负面影响,甚至可能是积极的影响,除了转换和距离函数的(几乎可以忽略的)执行时间。

数据转换的原因来自树的固有约束:树是一个逐位的trie,这意味着它只能存储位序列(可以看作整数)。为了在树中存储浮点数,我们只需使用浮点数的IEEE位表示并将其解释为整数(这对正数有效,负数有点复杂)。至关重要的是,这保留了排序,即。如果浮点f1大于f2,那么int(f1)的位的整数表示也总是大于int(f2)。通常,这种转换允许将浮点数存储为整数而不会丢失任何精度(!)。

转换是非度量的,因为浮点数的前导位(符号位之后)是指数位,后跟小数位。显然,如果两个数字的指数位不同,则它们的距离会随着分数位差异导致的距离的增长呈指数级增长(或者对于负指数而言会更慢)。

为什么我们使用逐位尝试?如果我们有d维,它允许简单的变换,使得我们可以将坐标的每个d值的第n位映射到具有d位的位串。例如,对于d = 60,我们得到一个60位的字符串。假设CPU寄存器宽度为64位,这意味着我们可以在恒定时间内执行与查询相关的许多操作,即许多操作仅花费一个CPU操作,而与我们是否具有3维或60维无关。可能很难理解这篇简短的文字会发生什么,有关详细信息可以在here找到。