LSH 来自楼下的塘北

位置敏感哈希:Locality Sensitive Hashing

转自 楼下的塘北  致谢!http://blog.youtueye.com/work/lsh.html

 前一篇讲到用于高维数据搜索的方法--最近邻搜索,而之于其中的方法是基于树结构的索引(如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)如果 vB(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 范数 xy1=di|xiyi| 近似于Hamming空间,那么 哈希函数可选为从 Rd 空间到Hamming空间的映射。

假设 p Ld1 空间中的向量,且 p 的每一维为非负整数,最大值为 c 。LSH算法建立 l 个散列表,每个散列表 Ti(i=0,,l1) 包含 M 个存放数据的桶,其中要涉及两个散列函数 gi,hi 。LSH为向量 p 在散列表 Ti 中建立索引的流程如下:

(1)将向量 p 转化为Hamming空间 Hc×d 中的二进制向量 pH (每一维仅为0或1): pH=Unary(c)(p[0])Unary(c)(p[d1])
其中, Unary(x) 是将整数 x 转化为 c 维二进制向量,因此向量在Hamming空间 Hc×d 中的距离与在原始空间 Ld1 中的距离保持一致。
(2)将散列函数 gi 作用在 pH 上,得到 pH=gi(pH)
其中,散列函数 gi 为选择 pH 中的 k 个形成一个新的 k 维二进制向量 pH
(3)将散列函数 hi 作用在 pH 上,得到 Ii=hi(pH)
其中, hi(pH)=(k1j=0wi,j×pH[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:

LSH 介绍

 又好又快的检索:Fast Similarity Search

LSH小结系列

基于汉明距离的LSH图像检索算法

Paper:

 

资源:

LSHKIT: A C++ Locality Sensitive Hashing Library


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
lsh是Locality Sensitive Hashing(局部敏感哈希)的缩写,是一种用于高效处理海量数据的近似近邻搜索技术。而Python是一种广泛使用的编程语言,拥有丰富的科学计算、机器学习和数据处理库。所以,我们可以利用Python来实现LSH算法。 要实现LSH算法,首先需要理解LSH的核心思想。LSH利用哈希函数将数据点映射到不同的桶中,使得相似的数据点具有更高的概率被映射到相同的桶中。通过在相同的桶中进行近似近邻搜索,可以在大规模数据集中高效地找到相似的数据。 在Python中,我们可以使用NumPy和Scikit-learn等库来进行LSH算法的实现。首先,我们需要选择合适的哈希函数,并使用该函数将数据点映射到不同的桶中。然后,我们可以根据实际需求设计相似度度量和查询算法,以在桶中找到近似近邻。 具体步骤如下: 1. 导入所需的库,如NumPy和Scikit-learn。 2. 定义LSH函数,选择合适的哈希函数并实现哈希操作。 3. 载入数据集,并使用LSH函数将数据点映射到不同的桶中。 4. 实现相似度度量函数,通过计算数据点之间的距离或相似度来评估它们的相似程度。 5. 实现查询算法,通过在桶中搜索近似近邻来寻找相似的数据点。 6. 将LSH算法应用于实际问题,比如近似最近邻搜索,数据去重等。 需要注意的是,在实际应用中,LSH算法的性能往往取决于哈希函数的选择和参数的调优。因此,我们可以通过实验和调试来优化LSH算法的性能,并根据实际需求进行调整。 总之,利用Python可以实现LSH算法,并通过各种科学计算和数据处理库提供的功能来进行优化和扩展。这样就可以在海量数据集上高效地进行相似度搜索和数据处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值