局部敏感哈希

351 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 29 天,点击查看活动详情

局部敏感哈希

局部敏感哈希(Locality Sensitive Hashing,LSH)是一种用于解决高维数据近似最近邻问题的方法。在高维空间中,传统的搜索算法(如线性扫描)由于需要考虑所有数据点,导致效率低下。而局部敏感哈希算法将高维空间中的点通过哈希函数映射到低维空间中,并将相近的点在低维空间中映射到相近的桶中,从而实现高维空间中近似最近邻的搜索。

image.png

image.png

具体而言,LSH算法首先对数据集中的向量进行预处理,将它们通过多个哈希函数映射到多个哈希表中。然后,在查询时,同样将查询向量通过相同的哈希函数映射到相应的哈希表中,再在每个哈希表中搜索与查询向量相似的向量。最终,通过比较哈希表中相似向量的数量,找到最相似的向量。

常见的局部敏感哈希算法有:MinHash、SimHash、Hyperplane LSH、LSH Forest等。LSH算法适用于海量高维数据的相似性搜索,例如图像、音频、文本等领域。

最简单的局部敏感哈希就是做n次二分类,如果都一样说明有相似性,可以归为一类:

image.png

有了哈希编码,就可以用海明距离衡量文章的相似性。 但是,直接这样获得的哈希编码,丢失了关键词的权重信息。

SimHash

使用一个普通哈希函数代替了 n 次随机超平面划分,并且这个普通哈希函数的作用对象也不是文档,而是文档中的每一个关键词。这样一来,我们就能在计算的时候保留下关键词的权重了。

64 位的 SimHash 为例:

  1. 选择一个能将关键词映射到 64 位正整数的普通哈希函数。
  2. 使用该哈希函数给文档中的每个关键词生成一个 64 位的哈希值,并将该哈希值中的 0修改为 -1。比如说,关键词 A 的哈希值编码为 <1,0,1,1,0>,那我们做完转换以后,编码就变成了 <1,-1,1,1,-1>。
  3. 将关键词的编码乘上关键词自己的权重。如果关键词编码为 <1,-1,1,1,-1>,关键词的权重为 2,最后我们得到的关键词编码就变成了 <2,-2,2,2,-2>。
  4. 将所有关键词的编码按位相加,合成一个编码。如果两个关键词的编码分别为<2,-2,2,2,-2> 和 <3,3,-3,3,3>,那它们相加以后就会得到 <5,1,-1,5,1>。
  5. 将最终得到的编码中大于 0 的值变为 1,小于等于 0 的变为 0。这样,编码 <5,1,-1,5,1> 就会被转换为 <1,1,0,1,1>。

image.png

抽屉原理加速海明距离计算

如果两个文档的 SimHash 值的海明距离小于 k,我们就认为它们是相似的。 根据抽屉原理,将哈希编码分为k+1个尽可能等长的部分,如果两个文档相似,那么最少有一段相同。

image.png