计算集合中所有点到第k个最近邻居的距离


9

对于机器学习应用程序,我的团队需要针对每个(对于在5到100之间的计算到集合第个最近邻居的欧几里得距离。和几百到几百万)。当前,我们正在使用蛮力方法,或者在上带有kd树的显而易见的方法,当为高且相对较低永远不会赢。(一切都在内存中。)kXx(XY)Rdd|X||Y|O(d|X||XY|)Xd|X|

不过,似乎必须有一种比蛮力更好的方法-至少一种利用三角形不等式的优势,或者利用局部敏感的哈希值。一个合理的近似值也可能是可以的。

我能够找到的研究似乎集中在寻找单个最近邻居(或近似于最近的邻居)的问题上。我正在寻找的问题是否用其他名字命名,或者与我没有想到的相关问题有联系?


2
kd树确实利用了三角形不等式。您是否尝试过使用其他空间数据分区树?您可能要研究的另一件事(我对机器学习算法一无所知)这些特定点是否倾向于具有结构,这可以帮助您快速找到超平面并在类似kd的树中使用这些超平面,而不是通常的平均每位数坐标拆分,在高维度上效果不佳。
罗斯·斯尼德

@RossSnider感谢您的建议。可以肯定的是,KD树使用了三角形不等式,但是我想到的是比蛮力要快的东西。:)您还会建议其他哪些类型的空间数据分区树?在Wikipedia的列表中,也许只有vp树似乎适用,而且看来欧几里得距离似乎不比kd树更好。我会考虑是否存在一种更好的针对特定问题的方法来定义分离的超平面,但是没有想到。
Dougal

我想我希望我们知道我们正在对所有(以及其他点)进行评估,这一事实将为算法提供某种帮助。不过,我不确定情况是否如此。X
Dougal

什么是 k通常在您的应用程序中?
Suresh Venkat

1
@SureshVenkat我们通常使用 k大约3,有时更大一些。
Dougal

Answers:


10

这是一个可能有用的简单技巧。考虑一个随机样本,该样本以1 / k的概率选择每个点。可以很容易地验证样本中是否有k个最接近的邻居中的一个很可能。计算样本中最近的邻居。重复此O(k log n)次。极有可能在O(klogn)计算出的点是您查询的k个最近邻居。因此,找到k个最近的邻居,等同于O(klogn) 最近邻居查询。

简而言之,请给我一个用于回答最近邻居查询的快速数据结构,并且我很乐意为您提供k最近邻居的快速数据结构。


好招 也可以将样本用于不同的查询点,对吧?所以要计算ķ-set中的每个点的-nearest-neighbor,我只需要构建数据结构 Øķ日志ñ次。
Dougal

1
重用样本非常棘手,因为这样您就需要一个固定的样本可用于ANY查询(量化被翻转),因此概率将发生变化。然后,一般的想法是构造一个更大的样本集(取决于#queries)并使用它们(如果有问题的话)。
Suresh Venkat

@SureshVenkat当然可以。我会坐下来,找出实际的概率。谢谢大家!
Dougal

如果你这样做 Øķ日志1个/δ 样本,然后每个查询以概率成功 1个-δ。注意,这个技巧比乍一看要好一些-您已经Øķ日志ñ 样本,每个样本的大小 Øñ/ķ (如果 ķ不是太大)。这意味着每个样本的查询时间更长。
Sariel Har-Peled

3

使用“局部敏感哈希”的廉价近似解决方案是将每个点转换为位交错形式:

[xxx,yyy,zzz]-> xyzxyzxyz

然后对基数进行排序以进行预处理。

选择要查询的内容并继续 ķ 双向指向以获得尺寸 2ķ组; 然后拿ķŤH最接近您的观点。另请参阅Connor和Kumar的这篇论文

另请参阅Callahan和Kosaraju的这篇论文

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.