在 C# 中使用 LSH 进行近似最近邻搜索

Posted

技术标签:

【中文标题】在 C# 中使用 LSH 进行近似最近邻搜索【英文标题】:Approximate Nearest Neighbour Search with LSH in C# 【发布时间】:2015-03-18 04:02:49 【问题描述】:

我发现很多讨论和文章都可以在 3d 空间坐标中使用局部敏感散列 (LSH) 找到近似最近的邻居。不幸的是,我找不到任何真正的工作示例,其中所有内容都可以在单个复制粘贴代码中完成。

我正在使用 C#(更具体地说是 Unity)并注意到一些文章指出近似 NNS 可以成为游戏开发的快速方法。但是,我还没有找到任何真正的 C# 实现(或者如果 C# 不存在,可能是 C++)。

那么有人知道一些可能的解决方案吗?

【问题讨论】:

【参考方案1】:

为什么要在 3 维中使用 LSH?我建议您尝试一些基于树的方法,例如 KD-trees(有很多选择)。 Here 是关于 KD 树的 C# 问题。您可以查看ALGLIB 的 KD 树。

请注意,根据您的数据集,数据结构的选择会有所不同。你可以看看我所做的一些比较(虽然在更高维度上)here 和 here。


您可以查看此链接 LSH for Finding Similar Documents from a large number of Documents in C# 为了获得 C# 的味道。一个有趣的问题是here。


如果你坚持使用 LSH,那么既然你是做游戏开发的,C++ 可能也是一个选择,所以这里是E2LSH 库。


编辑

ANN 与近似 NNS 有关。它使用KD树和BBD树。您可以查看我对 ANNS here 的一些答案。

【讨论】:

嗨萨马拉斯,感谢您的留言。在this 线程中,我发现ANN 可以比kdtrees 快得多,仅从我将获得近似邻居的帐户来看。这正是我感兴趣的,因为对我来说 kdtrees 没有表现出足够的性能,而且在游戏中拥有“近似”邻居是可以接受的。 P.S.我对 C++ 很感兴趣,因为如果它还没有实现,我可能会尝试将它重写为 C#... 我不知道你想要 ANN!你的答案可以吗?还是我应该删除它? 答案看起来不错,可以保留。但是在谈到问题时,我对这些 ANN 算法感到好奇,如果没有一些算法已经用 C# 编写,那么我可以节省大量时间,而不是从 C++ 重写和重新实现一些东西。附:我还不确定 ANN 是否会是最好的,因为它是 4 年前制作的,在此期间可以改变很多事情。

以上是关于在 C# 中使用 LSH 进行近似最近邻搜索的主要内容,如果未能解决你的问题,请参考以下文章

快速近似最近邻搜索库 FLANN - Fast Library for Approximate Nearest Neighbors

如何通过R-最近邻求解最近邻?

如果我放宽一些约束,我可以得到近似最近邻的算法快捷方式吗?

二进制特征和局部敏感哈希 (LSH)

局部敏感哈希LSH

PCL中使用FLANN库