位置敏感哈希(Locality Sensitive Hashing,LSH)是近似最近邻搜索算法中最流行的一种,它有坚实的理论依据并且在高维数据空间中表现优异。由于网络上相关知识的介绍比较单一,现就LSH的相关算法和技术做一介绍总结,希望能给感兴趣的朋友提供便利,也希望有兴趣的同道中人多交流、多指正。
LSH原理
最近邻问题(nearest neighbor problem)可以定义如下:给定n个对象的集合并建立一个数据结构,当给定任意的要查询对象时,该数据结构返回针对查询对象的最相似的数据集对象。LSH的基本思想是利用多个哈希函数把高维空间中的向量映射到低维空间,利用低维空间的编码来表示高维向量。通过对向量对象进行多次哈希映射,高维向量按照其分布以及自身的特性落入不同哈希表的不同桶中。在理想情况下可以认为在高维空间中位置比较接近的向量对象有很大的概率最终落入同一个桶中,而距离比较远的对象则以很大的概率落入不同的桶中。因此在查询的时候,通过对查询向量进行同样的多次哈希操作,综合多个哈希表中的查询操作得到最终的结果。
使用哈希函数对整个数据集进行过滤,得到可能满足查询条件的点再计算距离,这样就避免了查询点与数据集中所有点进行距离计算,提高了查询效率。该框架可以被称为过滤-验证框架。
LSH函数族定义
为了形式化地描述LSH使用的哈希函数的性质,现定义LSH函数族概念。
令S为d维数据点的数据域,D为相似性度量函数,p和q为S中任意两点。函数族H={h:S->U}被称为(r1,r2,p1,p2)-敏感的,当且仅当:
通过使用LSH函数族中函数进行哈希,可以保证距离近的点冲突的概率大于距离远的点冲突的概率。
通用的LSH算法框架
构建LSH索引(哈希过程,Hashing)
定义一个函数族G={g:S->U},其中g(v)=(h1(v),...,hk(v)),hi∈H,独立随机地从G中选择L个哈希函数g1,...,gL。对于数据集中任意一点v,将其存储到桶gi(v)中,i=1,...,L。
这种算法是完全索引算法(full-indexing algorithms),它为每个可能的查询点提供一个查询表,因此,响应一个查询点,该算法只需在特殊构造的哈希表中进行一次查询(look-up)。
LSH搜索算法
对于一个查询点q以及给定的距离阈值r,搜索桶g1(q),...,gL(q),取出其中的所有点v1,...,vn作为候选近似最近邻点。对于任意的vj,如果D(q,vj)<=r,那么返回vj,其中D为相似性度量函数。
在创建LSH索引时,选取的哈希函数是k个LSH函数的串联函数,这样就相对拉大了距离近的点冲突的概率pn与距离远的点冲突的概率pf之间的差值,但这同时也使这两个值一起减小了,于是需要同时使用L张哈希表来加大pn同时减小pf。通过这样的构造过程,在查询时,与查询点q距离近的点就有很大的概率被取出作为候选近似最近邻点并进行最后的距离计算,而与查询点q距离远的点被当作候选近似最近邻点的概率则很小,从而能够在很短的时间内完成查询。
参考资料:
1、陈永健.基于内容的大规模图像检索关键技术研究[D].华中科技大学.2011
2、凌康.基于位置敏感哈希的相似性搜索技术研究[D].南京大学.2012