原始LSH算法trick
来源:互联网 发布:telnet 80端口失败 编辑:程序博客网 时间:2024/05/10 00:58
原始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排列
如此,即可避免将特征展开成串。
- 原始LSH算法trick
- Similarity Search in High Dimension via Hashing LSH 原始算法详解
- kernel trick的原始想法
- LSH算法原理
- LSH算法参考资料
- LSH搜索算法
- LSH算法学习笔记
- LSH之simHash算法
- LSH算法.p稳定hash
- KNN(六)--LSH算法
- lsh算法的资料网站
- KNN(六)--LSH算法
- 局部敏感哈希(原始LSH)C++实现
- 局部敏感哈希(原始LSH)python实现
- LSH
- LSH
- LSH
- LSH
- 【解题报告】滑雪
- SharePoint2016 New Feature (Preview) - 性能及限制优化
- JAVA 性能优化
- ZJU 3430 Detect the Virus AC自动机
- js\java 通过算法加密后,再base64
- 原始LSH算法trick
- iOS个人整理20-UITableViewCell自定义,cell高度的自适应(纯代码)
- JasperReport 报表在SpringMVC WEB项目中的应用(JavaBean作为数据源)
- (总结)Nginx配置文件nginx.conf中文详解
- php的strlen和mb_strlen的区别
- JSON序列化与反序列
- 【解题报告】传球游戏
- ELK
- 如果在docker中部署tomcat,并且部署java应用程序