我已经读过这个问题,但遗憾的是它没有帮助。
我不明白的是,一旦我们理解了哪个bucket分配给我们的高维空间查询向量q
,我们会做什么:假设使用我们的一组位置敏感的族函数h_1,h_2,...,h_n
,我们已经将q
转换为低维(n
维)散列码c
。
那么c
是q
被分配到的桶的索引,并且其中(希望)也被分配了它的最近邻居,假设有100个向量。
现在,为了找到q
的NN,我们只计算q
和这100个向量之间的距离,对吗?所以c
的使用仅用于索引(它仅用于决定将q
分配给哪个bucket),对吧?
如本次调查(第2.2节)所述,另一种解决方案是"哈希表查找"(前面描述的方法)的替代方案是"快速距离近似",因此我们进行了详尽的研究,计算c
和生成的哈希码之间相对于数据集中每个元素的距离。这应该很快,因为哈希码在低维空间中,并且距离应该计算得更快(例如,如果哈希码空间是二进制的,那么我们可以使用XOR运算符来快速计算两个哈希码之间的hamming距离)。
现在,我想知道的是:这两种方法的优点/缺点是什么?为什么我应该使用一种方法而不是另一种方法?
第一个描述的方法解释了近似近邻搜索。是的,只需检查容器c
中的这100个其他项目,您就会获得最佳性能,但在其他相邻容器中错过好的候选者的风险更高。
一个简单的lat/lon坐标哈希方案是Geohash。您可以通过查看同一Geohash块中的商品来找到最近的商店,但在网格边界附近可能会出现不准确的结果。
快速距离近似的一个例子可以在这里找到,它发现具有足够小的汉明距离的图像匹配(利用pHash)。由于散列只有64位长,笔记本电脑GPU每秒可以进行7亿次比较。请注意,将检查所有图像,不使用索引或哈希数据结构。通过这种方式,你的年龄保证能得到所有匹配(在pHash空间)。