LSH最根本的目的是能高效处理海量高维数据的最近邻问题。在信息检索,数据挖掘以及推荐系统等应用中,我们经常会遇到的一个问题就是海量的高维数据查找最近邻。不同于我们在数据结构教材中对哈希算法的认识,哈希最开始是为了减少冲突方便快速增删改查,在这里LSH恰恰相反,它利用的正是哈希冲突加速检索,并且效果极其明显。
LSH(局部敏感哈希)函数使得2个相似度很高的数据以较高的概率映射成同一个hash值,而2个相似度很低的数据以极低的概率映射成同一个hash值。
定义 3: 给定一族哈希函数 H H ,是一个从欧式空间 S S 到哈希编码空间的映射。如果以下两个条件都满足,则称此哈希函数满足 (r1,r2,p1,p2) ( r 1 , r 2 , p 1 , p 2 ) 性。
- 如果 d(O1,O2)<r1 d ( O 1 , O 2 ) < r 1 ,那么 Pr[h(O1)=h(O2)]≥p1 P r [ h ( O 1 ) = h ( O 2 ) ] ≥ p 1
- 如果 d(O1,O2)>r2 d ( O 1 , O 2 ) > r 2 ,那么 Pr[h(O1)=h(O2)]≤p2 P r [ h ( O 1 ) = h ( O 2 ) ] ≤ p 2
其中, O1,O2∈S O 1 , O 2 ∈ S ,表示两个具有多维属性的数据对象, d(O1,O2) d ( O 1 , O 2 ) 为2个对象的相异程度,也就是1 - 相似度。其实上面的这两个条件说得直白一点,就是当足够相似时,映射为同一hash值的概率足够大;而足够不相似时,映射为同一hash值的概率足够小。
使用
lshash
pip install lshash
from lshash import LSHash
lsh = LSHash(hash_size, input_dim, num_of_hashtables=1, storage=None, matrices_filename=None, overwrite=False)