位置敏感哈希(LSH)是如何工作的



我已经读过这个问题,但遗憾的是它没有帮助。

我不明白的是,一旦我们理解了哪个bucket分配给我们的高维空间查询向量q,我们会做什么:假设使用我们的一组位置敏感的族函数h_1,h_2,...,h_n,我们已经将q转换为低维(n维)散列码c

那么cq被分配到的桶的索引,并且其中(希望)也被分配了它的最近邻居,假设有100个向量。

现在,为了找到q的NN,我们只计算q这100个向量之间的距离,对吗?所以c的使用仅用于索引(它仅用于决定将q分配给哪个bucket),对吧?


如本次调查(第2.2节)所述,另一种解决方案是"哈希表查找"(前面描述的方法)的替代方案是"快速距离近似",因此我们进行了详尽的研究,计算c和生成的哈希码之间相对于数据集中每个元素的距离。这应该很快,因为哈希码在低维空间中,并且距离应该计算得更快(例如,如果哈希码空间是二进制的,那么我们可以使用XOR运算符来快速计算两个哈希码之间的hamming距离)。

现在,我想知道的是:这两种方法的优点/缺点是什么?为什么我应该使用一种方法而不是另一种方法?

第一个描述的方法解释了近似近邻搜索。是的,只需检查容器c中的这100个其他项目,您就会获得最佳性能,但在其他相邻容器中错过好的候选者的风险更高。

一个简单的lat/lon坐标哈希方案是Geohash。您可以通过查看同一Geohash块中的商品来找到最近的商店,但在网格边界附近可能会出现不准确的结果。

快速距离近似的一个例子可以在这里找到,它发现具有足够小的汉明距离的图像匹配(利用pHash)。由于散列只有64位长,笔记本电脑GPU每秒可以进行7亿次比较。请注意,将检查所有图像,不使用索引或哈希数据结构。通过这种方式,你的年龄保证能得到所有匹配(在pHash空间)。

最新更新