前一篇讲到用于高维数据搜索的方法--最近邻搜索,而之于其中的方法是基于树结构的索引(如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 关于
(r
1
,r
2
,p
1
,p
2
)
对
v,qS
是敏感的(Sensitive),其中
p
1
>p
2
,r
1
<r
2
,满足:
(1)如果
vB(q,r1
)
, 那么
P
rH
[h(q)=h(v)]p
1
(2)如果
v∉B(q,r2
)
, 那么
P
rH
[h(q)=h(v)]p
2
其中,
vB(v,r)
定义为 度量空间
M=(S,d)
中以
vS
为中心,
r
为半径的类球体:
B(v,r)={qS|d(v,q)r}
这样,只要选择一族这样的映射
G={g:SUk
}
,
?g(p)=(h
1
(p),⋯,h
k
(p)),h
i
H
,中的
l
个:
g
1
,⋯,g
l
,将
S
中的点集
pP
散列到苦干个桶
g
j
(p)
中。
2. 实现 LSH
A. Gionis, P. Indyk, R. Motwani 在 [Gionis & Indyk & Motwani '99] 中详细说明了LSH的实现。作者证明LSH可成功解决
Ld
1
空间上的
(r,ε)−NN
问题,同时也在概率意义下成功解决了
ε−NN
问题,并保证了查询时间的上界为
O(dn
1/(1+ε)
)
,而原始LSH算法仅为
O(dn
1/ε
)
。
注意到
Rd
空间的赋
l
1
范数
x−y
1
=
d
i
|x
i
−y
i
|
近似于Hamming空间,那么 哈希函数可选为从
R
d
空间到Hamming空间的映射。
假设
p
为
L
d
1
空间中的向量,且
p
的每一维为非负整数,最大值为
c
。LSH算法建立
l
个散列表,每个散列表
T
i
(i=0,⋯,l−1)
包含
M
个存放数据的桶,其中要涉及两个散列函数
g
i
,h
i
。LSH为向量
p
在散列表
T
i
中建立索引的流程如下:
(1)将向量
p
转化为Hamming空间
H
c×d
中的二进制向量
p
H
(每一维仅为0或1):
p
H
=Unary
(
c)(p[0])⋯Unary
(
c)(p[d−1])
其中,
Unary(
x)
是将整数
x
转化为
c
维二进制向量,因此向量在Hamming空间
H
c×d
中的距离与在原始空间
L
d
1
中的距离保持一致。
(2)将散列函数
gi
作用在
p
H
上,得到
p
′
H
=g
i
(p
H
)
。
其中,散列函数
gi
为选择
p
H
中的
k
个形成一个新的
k
维二进制向量
p
′
H
。
(3)将散列函数
hi
作用在
p
′
H
上,得到
I
i
=h
i
(p
′
H
)
。
其中,
hi
(p
H
)=(
k−1
j=0
w
i,j
×p
′
H
[j])
,
W
i
={w
i,1
,⋯,w
i,k
}
是与
h
i
相关联的一组系数。
(4)将向量
p
存放到
T
i
的第
I
i
个桶中。
在实际应用中散列表的个数
l
,每个散列表的桶数
M
以及散列函数
g
i
从向量
p
H
中选择的向量维数
k
都是LSH的重要参数。
3. 欧氏空间 LSH
M. Datar, N. Immorlica, P. Indyk, and V. S. Mirrokni.在[ACM'04]中提出基于稳态分布(p-stable)的LSH,从而适用于欧氏空间(
Ld
2
)。
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