本篇笔记基于文章Similarity search in high dimensions via hashing。
历史
locality-sensetive hashing 局部敏感哈希,简称为LSH,最早由Indyk于1998年提出 [ 1 ] ^{[1]} [1],1999年被用于解决高维度海量数据的近似查找 [ 2 ] ^{[2]} [2]。
近邻查找
先来看看什么是k-NN和 ϵ \epsilon ϵ-NN问题。
k-NN问题指对于一个点集P和一个特定点q,寻找点集P中距点q最近的k个点。
ϵ \epsilon ϵ-NN问题指对于一个点集P和一个特定点q,假定点集P距离点q最近的点为p,寻找点集P中所有与点q距离在d(p,q)到 ( 1 + ϵ ) d ( p , q ) (1+\epsilon)d(p,q) (1+ϵ)d(p,q)的点。
LSH算法
我们知道哈希算法目标是减少冲突方便快速查找。当维度很高,数据量很大的情况下,对于kNN问题,尽管一一匹配查找是线性的时间复杂度,计算成本也相当高。后续有人提出了KD tree,SR tree等等基于树形结构的搜索方案,但只能适用于低维度数据。
LSH算法可以快速有效地近似查找高维度海量数据。原理很简单,如果两个数据在高维空间中距离相近,则他们的哈希值有很大概率是一样的,反之如果两个数据在高维空间中距离较远,则他们的哈希值一样的概率非常小。
LSH哈希函数的定义如下:
若 p ∈ B ( q , r 1 ) , 则 P r [ h ( q ) = h ( p ) ] ≥ p 1 若p \in B(q,r_1),则Pr[h(q) = h(p)] \geq p_1 若p∈B(q,r