原始LSH算法trick

原始LSH算法通过将特征映射为01串并使用hash函数降低搜索复杂度。然而,高维特征会导致长串,消耗大量存储和时间。论文提出了一种trick,避免直接展开为串。通过选取的bit位直接作用于原始特征,计算每个维度小于等于特征值的bit数,生成最终的value,从而节省空间和时间。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

   原始LSH算法算法原理是将特征逐维映转成01串,之后进行hash(随机选bit),将空间中中相近的点hash到同一个桶;这样在查询中,只在同一个桶内暴力搜索即可,相较于在整个数据库中暴力查找,无疑减少了两两比较的次数,减少检索时间。
  算法实现中,如果真的逐维把特征值展开成01串,对于高维特征(维度几千),那么这个展开的“串”将特别的长,例如4000维特征,特征类型uchar,那么其转换成的串的长度为:255**4000,既占用存储空间,又浪费时间。原论文中提到了一个trick来避免转成“串”的这个过程,下面我试着解释一下这个trick。
   假设特征为[4,2,5],特征最大值为5,那么将特征逐维度展开后的01“串”为:
          这里写图片描述

   假设hash函数随机选取的bit位为:[2,3,6,8,10],那么提取出来的value为11101,这是展开成“串”的做法,下面我们换一种思路。
   提取出的bit位 bits=[2,3,6,8,10]实质上分别作用于原始特征[4,2,5]的某一维:bits0 =[2,3]提取第一维(4)展开的串,bits1=[6,8]提取第二维(2)站看的串,bits2=[10]提取第三维(5)展开的串,提取出对应的bit值后,连起来就是最终的value。
    先观察一下第一维特征4,其展开形式为4个1加(最大值(5)-4)个0:[ 1 1 1 1 0 ],根据之前讨论,bits0=[2,3]是对应该串腰提取出的bit,那么提取出的是[1 1]。仔细观测可以发现,实际上bits中小于等于当前特征值的bit有几个,那提取出的1就有几个,用公式表示为:
                  value=[1*m,0*n]
              m : bits中小于等于改特征值的bit的个数
              n=:bits中大于改特征值的bit的个数
              *times:表示连续times个n排列
     如此,即可避免将特征展开成串。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值