LSH(Locality Sensitive Hashing)
- 一、局部敏感哈希LSH
- 二、Hamming 距离
- 三、Euclidean 距离
- 四、Jaccard 系数
- 五、参考资料
在很多问题中,从海量数据库中寻找到与查询数据相似的数据是一个很关键的问题。比如在图片检索领域,需要找到与查询图像相似的图片,又比如在3D维重建和 视觉SLAM等问题中,需要在3维点云模型(数据库)中找到与查询描述子最相近的描述子,以实现特征匹配。这个问题也叫近似近邻问题 Approximate Near Neighbor。当数据中的数据量很大时(百万以上),线性查找是不实际的,kd-tree是一个很好算法,但是当数据的维数很高时,kd-tree的性能将变得很差(kd-tree只适用数据在30维以下)。对于高维数据的海量数据近邻查找,局部敏感哈希是一个很好的解决方法。
局部敏感哈希(Locality Sensitive Hashing)是一个方法,应用到不同数据的距离度量时,两个数据之间的相似性(相似性往往是和距离是负相关的)有不同的衡量,那么就需要不同的算法。下面我先总体介绍局部敏感哈希方法,然后针对不同的距离度量空间来具体展开介绍,主要包括了Hamming距离、Euclidean距离、Jaccard 系数、余弦相似度。
如上图是一个图片检索的例子,应用LSH可以从海量数据库中快速检索出所查询的图片。
一、局部敏感哈希LSH
先说说哈希Hash,哈希是通过一个哈希函数(Hash function)将数据映射到一个哈希表(Hash Table),通过哈希表的索引,来使搜索时间从线性搜索的O(N)降到O(1)。这里的关键在于哈希函数的选取,对于不同的应用和数据会有不用的哈希函数。
局部敏感哈希的基本思想:在高维数据空间中的两个相邻的数据被映射到低维数据空间中后,将会有很大的概率任然相邻;而原本不相邻的两个数据,在低维空间中也将有很大的概率不相邻。通过这样一映射,我们可以在低维数据空间来寻找相邻的数据点,避免在高维数据空间中寻找,因为在高维空间中会很耗时。有这样性质的哈希映射称为是局部敏感的。
局部敏感哈希定义:
一个哈希函数族满足如下条件时,被称为是 (R,cR,P1,P2) -sensitvie,对于任意两个点 p,q∈Rd :
为了让局部敏感哈希函数族起作用,需要满足 c>1 , P1>P2 .
举个例子来说明这个概念。考虑二进制的两个数据点 p,q ,它们的每一个比特位要么是0要么是1。它们之间的距离是用Hamming距离来计算的,也是就不同的比特位数。我们使用一个很简单的哈希函数族 H ,每一个哈希函数是随机的选择一个特定的比特位上的值,
H 包含了所有的从 { 0,1}d 映射到 { 0,1} 的函数,并且有 hi(p)=pi 。从 H 中随机地选择哈希函数h ,那么 hi(p) 将会随机地返回 p 的一个比特位。
那么Pr[h(p)=h(q)] 就等于 p,q 中相同的比特位数的比例,因此有 P1=1−R/d , P2=1−cR/d ,对于任意的 c>1 ,都满足 P1>P2 。即这种构造出来的哈希函数族是局部敏感的![1]
Emdedding:
上面讲的一个例子因为数据本身刚好就是二进制,使用的Hamming距离,不需要其他的操作,但是实际上在最开始提出LSH时,是还有一个Embedding操作的。
Original LSH在哈希之前,首先要先将数据从L1准则下的欧几里得空间嵌入到Hamming空间,因为L2准则下的欧几里得空间没有直接的方法嵌入到Hamming空间。在做此Embedding时,有一个假设就是原始点在L1准则下的效果与在L2准则下的效果相差不大,即欧氏距离和曼哈顿距离的差别不大。
Embedding算法:
1. 找到所有点的所有坐标值中的最大值C;
2. 对于一个点P来说,P=(x1,x2,…,xd),d是数据的维度;
3. 将每一维xi转换为一个长度为C的0/1序列,其中序列的前xi个值为1,剩余的为0.
4. 然后将d个长度为C的序列连接起来,形成一个长度为Cd的序列.
值得说明的是,Embedding操作是保距离的,即在Embedding前后两个点之间的距离是不变的。更多细节可看论文[2]
概率放大:
一个哈希函数族的概率 P1,P2 之间的差不够大,通常会通过增加哈希键的长度 k 和哈希表的个数