前一篇讲到用于高维数据搜索的方法--最近邻搜索,而之于其中的方法是基于树结构的索引(如K-D Tree),当数据维数过大时,其效率同线性扫描。研究人员试图寻找一种在保证一定准确性的前提下,时间和空间复杂度得到降低,并且能够很好地支持高维数据的检索算法,这里介绍的LSH(Locality Sensitive Hashing,位置敏感哈希)便是就这一问题产生的。
简单地讲,LSH建立了一种映射准则:将原始高维数据空间S中的点映射到相对低维空间U,保证S中距离相近的点,其在U中的映射点,也具有较大概率的距离相近,甚至是相等;那么在做搜索时,将查询点做映射,在U中查找与该映射值相近的点;这样,这些查找到的映射点的原象,即是S中与查询点相近的点,因此,这种方法称为是“位置敏感”(Locality Sensitive)的。那么,映射的建立、空间的选择以及空间的度量,是LSH要研究的问题。
如上图所示,空间上的点经位置敏感哈希函数散列之后,对于q,其rNN有可能散列到同一个桶(如第一个桶),即散列到第一个桶的概率较大,会大于某一个概率阈值p1;而其(1+c)rNN之外的对象则不太可能散列到第一个桶,即散列到第一个桶的概率很小,会小于某个概率阈值p2。当然,为了尽可能地减少冲突,可建立多个散列表,每个散列表对应多个桶。(via)
关于LSH的理论及发展,本文按如下线路说开:
1. 原始 LSH
P. Indyk 和 R. Motwani 在 [Indyk & Motwani '98] 中首次提出LSH的概念:
定义:映射 H={h:SU} 对于度量D 关于 (r1,r2,p1,p2) 对 v,qS 是敏感的(Sensitive),其中 p1>p2,r1<r2 ,满足:
(1)如果 vB(q,r1) , 那么 PrH[h(q)=h(v)]p1
(2)如果 v∉B(q,r2) , 那么 PrH[h(q)=h(v)]p2
其中, vB(v,r) 定义为 度量空间 M=(S,d) 中以 vS 为中心, r 为半径的类球体: B(v,r)={qS|d(v,q)r}
这样,只要选择一族这样的映射 G={g:SUk} , ?g(p)=(h1(p),⋯,hk(p)),hiH ,中的 l 个: g1,⋯,gl ,将 S 中的点集 pP 散列到苦干个桶 gj(p) 中。
2. 实现 LSH
A. Gionis, P. Indyk, R. Motwani 在 [Gionis & Indyk & Motwani '99] 中详细说明了LSH的实现。作者证明LSH可成功解决 Ld1 空间上的 (r,ε)−NN 问题,同时也在概率意义下成功解决了 ε−NN 问题,并保证了查询时间的上界为 O(dn1/(1+ε)) ,而原始LSH算法仅为 O(dn1/ε) 。
注意到 Rd 空间的赋 l1 范数 x−y1=di|xi−yi| 近似于Hamming空间,那么 哈希函数可选为从 Rd 空间到Hamming空间的映射。
假设 p 为 Ld1 空间中的向量,且 p 的每一维为非负整数,最大值为 c 。LSH算法建立 l 个散列表,每个散列表 Ti(i=0,⋯,l−1) 包含 M 个存放数据的桶,其中要涉及两个散列函数 gi,hi 。LSH为向量 p 在散列表 Ti 中建立索引的流程如下:
(1)将向量
p
转化为Hamming空间
Hc×d
中的二进制向量
pH
(每一维仅为0或1):
pH=Unary(c)(p[0])⋯Unary(c)(p[d−1])
其中,
Unary(x)
是将整数
x
转化为
c
维二进制向量,因此向量在Hamming空间
Hc×d
中的距离与在原始空间
Ld1
中的距离保持一致。
(2)将散列函数
gi
作用在
pH
上,得到
p′H=gi(pH)
。
其中,散列函数
gi
为选择
pH
中的
k
个形成一个新的
k
维二进制向量
p′H
。
(3)将散列函数
hi
作用在
p′H
上,得到
Ii=hi(p′H)
。
其中,
hi(pH)=(k−1j=0wi,j×p′H[j])
,
Wi={wi,1,⋯,wi,k}
是与
hi
相关联的一组系数。
(4)将向量
p
存放到
Ti
的第
Ii
个桶中。
在实际应用中散列表的个数
l
,每个散列表的桶数
M
以及散列函数
gi
从向量
pH
中选择的向量维数
k
都是LSH的重要参数。
3. 欧氏空间 LSH
M. Datar, N. Immorlica, P. Indyk, and V. S. Mirrokni.在[ACM'04]中提出基于稳态分布(p-stable)的LSH,从而适用于欧氏空间( Ld2 )。
4. 基于核 SH(Kernelized Locality-Sensitive Hashing)
Brian Kulis, Prateek Jain, & Kristen Grauman 在 [PAMI '09] 中对Mahalanobis距离 进行扩展,引入核方法及半监督学习以降低映射的计算量及LSH参数的选择。
项目主页:Kernelized Locality-Sensitive Hashing
5. LSH 综述
Piotr Indyk 的 学生 在其 Alex Andoni 博士毕业论文[Andoni '09]中 对已有LSH进行了总结,并开发了适用于欧氏空间上的LSH算法实现:E2LSH。
项目主页: LSH Algorithm and Implementation (E2LSH)
实践:
1. 在VC2005+OpenCV2.2下,结合LSHKIT,使用SIMPLIcity Image Database(1000 images),应用简单的颜色特征,结果如下:
2. 另外一个在线的演示来自Princeton 的 Wei Dong :http://www.simigle.com:8080/,号称是索引了三千万淘宝商品图片和三千万Flickr图片,经测试,效果还好。另外 ,其也是LSHKIT 项目的参与者。
Blog:
又好又快的检索:Fast Similarity Search
Paper:
资源:
LSHKIT: A C++ Locality Sensitive Hashing Library