局部敏感哈希(Locality-Sensitive Hashing, LSH)是一种算法技术,主要用于高维数据的相似性搜索和近似最近邻查询。LSH 的核心思想是通过构建一组哈希函数,确保相似的输入数据经过哈希变换后具有较高的概率会被映射到同一个哈希桶中。LSH 在解决高维数据空间中有效相似性搜索的问题上具有重要应用,尤其是在图像、音频、文档和生物信息等需要快速查询相似项的领域。
Shingling
实际上就是一种OneHot的生成方法,下图展示的非常明白,其中shingle set实际上就是2-gram set,把这个2-gram set经过shuffle得到vocab,上面"Flying fish flew by the space station"中出现过的2-gram就这样被映射成了下图最右侧的one-hot
minhash
就是字面的意思得到最小的hash值。刚才已经得到了一个one hot向量,下图这个one hot向量长度为6,然后把[1,2,3,4,5,6]进行了4次shuffle,分别得到下图中蓝色、红色、绿色、黑色的四个随机排列。这四轮中下标为1的值里面最小的就是对应的signature。举个例子,min{4,3,2}=2,所以蓝色的signature就是2,其中4,3,2就是shingled sparse vector为1对应的值
LSH
把刚才得到的signature分段,每一段叫做一个band。如果两个向量的其中一个或多个band相同,那么这两个向量就可能相似度较高;相同的band数越多,其相似度高的可能性越大。所以LSH的做法就是对各个用户的signature向量在每一个band上分别进行哈希分桶,在任意一个band上被分到同一个桶内的用户就互为candidate相似用户,这样只需要计算所有candidate用户的相似度就可以找到每个用户的相似用户群了。下图中是分了3个band,第3个band中存在bucket match,那么相似度就较高。
LSH分桶优化
参考文档
- https://www.pinecone.io/learn/series/faiss/locality-sensitive-hashing/
- https://zhuanlan.zhihu.com/p/46164294