KNN优化算法4:LSH

参考文章:https://blog.csdn.net/cshilin/article/details/52119682

                  https://blog.csdn.net/icvpr/article/details/12342159

LSH(Location Sensitive Hash),即位置敏感哈希函数。与一般哈希函数不同的是位置敏感性,也就是散列前的相似点经过哈希之后,也能够在一定程度上相似,并且具有一定的概率保证。

LSH算法分两种:SimHash和MinHash。

simhash的原理是减少搜索空间,用汉明距离替代余弦距离

minHash的原理是降维。通过hash映射函数,将特征元素的个数降下来。

形式化定义:

对于任意q,p属于S,若从集合S到U的函数族H={h1,h2...hn}对距离函数D(,),如欧式距离、曼哈顿距离等等,满足条件:

image

则称D(,)是位置敏感的。

如下图,空间上的点经位置敏感哈希函数散列之后,对于q,其rNN有可能散列到同一个桶(如第一个桶),即散列到第一个桶的概率较大,会大于某一个概率阈值p1;而其(1+emxilong)rNN之外的对象则不太可能散列到第一个桶,即散列到第一个桶的概率很小,会小于某个阈值p2.

image

LSH的作用

◆高维下近似查询

相似性检索在各种领域特别是在视频、音频、图像、文本等含有丰富特征信息领域中的应用变得越来越重要。丰富的特征信息一般用高维向量表示,由此相似性检索一般通过K近邻或近似近邻查询来实现。一个理想的相似性检索一般需要满足以下四个条件:

1. 高准确性。即返回的结果和线性查找的结果接近。

2. 空间复杂度低。即占用内存空间少。理想状态下,空间复杂度随数据集呈线性增长,但不会远大于数据集的大小。

3. 时间复杂度低。检索的时间复杂度最好为O(1)或O(logN)。

4. 支持高维度。能够较灵活地支持高维数据的检索。

传统主要方法是基于空间划分的算法——tree类似算法,如R-tree,Kd-tree,SR-tree。这种算法返回的结果是精确的,但是这种算法在高维数据集上的时间效率并不高。实验[1]指出维度高于10之后,基于空间划分的算法时间复杂度反而不如线性查找。LSH方法能够在保证一定程度上的准确性的前提下,时间和空间复杂度得到降低,并且能够很好地支持高维数据的检索。

◆分类和聚类

根据LSH的特性,即可将相近(相似)的对象散列到同一个桶之中,则可以对图像、音视频、文本等丰富的高维数据进行分类或聚类。

◆数据压缩。如广泛地应用于信号处理及数据压缩等领域的Vector Quantization量子化技术。

总而言之,哪儿需要近似kNN查询,哪儿都能用上LSH.

 

1 Jaccard相似度

 

    Jaccard相似度计算十分便于计算离散集合之间的相似度,在个性化推荐中应用极广。Jaccard的相似度计算如图1所示,其中S和T的相似度为J(S,T)=3/8。

image图1 Jaccard相似度计算

    PS:大量连续的相似度计算,也可以转成Jaccard相似度计算,在此不述。

2 Simhash

    Simhash主要做用是使复杂度o(nml)中,使m<<n,即大幅减小搜索空间的作用。例如计算item a的近临(top M)时,只搜索一个特定的近临空间m,而非整个庞大的n空间。

    Simhash是通过设计一个hash方法,使要内容相近item生的hash签名也相近,hash签名的相近程度,也能反映出item间的相似程度。

    Simhash算法如下:

假设item={item1,item2,…},取hash函数,将item的每一个元素hash成一个M位的int签名值,将int值按二进制表示,0处全表示为-1,记为H,将所有按位相加,最后加正的位为1,为负的位值为0,这就是item最后的simhash结果。这样就可以使相似的item有相近的hash值。

    举例说明如下,假设item a ={1,2,3,4}, item b={1,2,3,5}, h(x)=x%8,M=3,有如图2中的结果,item a的sim hash值为(0,0,1,0),item b的sim hash值为(0,0,1,1),可见两者的sim hash值相似,通过两者的汉明码计算,便可以用汉明码来衡量两者的相似程度。

image图2 simhash计算

    从降维的脚度看,通过将item预处理为simhash值后,通过计算两者的汉明距离计算相似度。可惜汉明距离并不能完全表征两者的实际相似程度,因而simhash常用于缩小搜索空间,计算item a的top M相似item时,搜索限为汉明距离最近的空间中。例如假设hash在64位,共将有264个hash桶,将所有item预先按hash桶建好索引后,计算item a的top M或满足某域值的相似item时,可从最近的hash桶中搜索,最近的桶为本桶中的其它item,其次为1位不同的其它hash桶,共64个,再次为2位不同的桶,共64*64个…

3 Minhash  

    Minhash主要做用是使复杂度o(nml)中,使l<<k,即减小计算两两相似度计算的维数。

    由第1节可知,计算J(S,T)的关键在于计算S∩T或S∪T。直接求S∩T或S∪T,在有序的归并方法中,复杂度也是k的级别。Minhash的目的是降维,主要原理是两集合经随机转换后得到的两个最小hash值相等的概率等于两集合的Jaccard的相似度!(可以枚举出相应结果)。

     由于只取一个hash函数时,只有相等与不等两个结果,对应于原理,也就只有相似与不相似不个结果。取一系列hash函数后,便可以概率性地统计出结果,而取hash函数的个数据,决定将k降维后的维数l,l越大,相似结果与实际相似度越相近,一般10个左右就已经能满足工程需求。

     这样数据预处理完后,计算两item间的复杂度,就等于计算最小Minhash相同的概率了。

    PS:在工程中,不容易找一系列的hash函数,由hash母函数生成的一系列hash函数可能相关,将降低Minhash的经度。

4 优势与局限性

    Simhash和Minhash都有明显的应用局限性:

1、集合中的item要比较多;

2、所求的相关项要比较相似;

    优势:

1、简化复杂相似项计算;

2、原理易于理解,点破后,给人显而易见的感觉。

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值