局部敏感哈希(Locality-Sensitive Hashing, LSH)
局部敏感哈希是工程实际中主流的快速 Embedding 向量最近邻搜索方法,它属于近似最近邻查找(Approximate Nearest Neighbor, ANN)的一种。
1 局部敏感哈希的基本原理
局部敏感哈希的基本思想是:让相邻的点落入同一个“桶”中,在进行最近邻搜索时,只需要在一个桶,或者相邻的几个桶内进行搜索。
LSH 算法基本原理是:用一个Hash 方法将数据从原空间映射到一个新的空间中,使得在原空间相似(距离近)的数据,在新的空间中也相似的概率很大,而在原空间不相似(距离远)的数据,在新的空间中相似的概率很小。
例如我们基于欧式距离进行最近邻搜索时,原空间为高维的欧式空间,映射的新的空间为一个低维欧式空间,我们容易推得:在原高维空间中相似的点,在低维的空间肯定也相似,但原本不相似的点在低维空间中是有一定的小概率成为相似的点的。
1.1 哈希函数(Hash Functions)应满足的条件
令 h(x)h(x)h(x) 表示样本 xxx 的哈希变换,xxx 与 yyy 为两个任意的样本,d(x,y)d(x,y)d(x,y) 为 xxx 与 yyy 之间的距离,d1d_1d1 与 d2d_2d2 为两个常量值,且 d1<d2d_1<d_2d1<d2,p1p_1p1 与 p2p_2p2 为两个介于 0 与 1 之间的常量值,若 h(x)h(x)h(x) 满足以下两个条件,则称哈希函数 h(x)h(x)h(x) 为 (d1,d2,p1,p2)(d_1,d_2,p_1,p_2)(d1,d2,p1,p2)-senstive:
- 如果 d(x,y)≤d1d(x,y)\leq d_1d(x,y)≤d1,则 h(x)=h(y)h(x)=h(y)h(x)=h(y) 的概率至少为 p1p_1p1
- 如果 d(x,y)≥d2d(x,y)\geq d_2d(x,y)≥d2,则 h(x)=h(y)h(x)=h(y)h(x)=h(y) 的概率至多为 p2p_2p2
通过一个或多个 (d1,d2,p1,p2)(d_1,d_2,p_1,p_2)(d1,d2,p1,p2)-senstive 的哈希函数对原始数据集合进行哈希运算,得到一个或者多个哈希表的过程就称为是 局部敏感哈希。
1.2 LSH 的多桶策略
因为哈希映射过程损失了部分的距离信息,如果只使用一个哈希函数进行分桶,则会存在相似点误判的情况,解决的方式是采用多(mmm)个哈希函数同时进行分桶,同时掉进 mmm 个哈希函数同一个桶中的两个点,是相似点的概率则大大增加。
通过分桶找到候选集合后,就可以在有限的候选集合中通过遍历的方法找到最近的 KKK 个近邻。
在用多个哈希函数进行分桶时,应该通过“与”(And/交集)操作还是“或”(Or/并集)操作生成最终的候选集合呢?
- 如果通过“与”操作生成候选集,则候选集合中近邻点的准确率将提高,候选集合的样本数量也会减少,从而使最后遍历的时间缩短,但有可能会漏掉一些近邻点;
- 如果通过“或”操作生成候选集,那么候选集合的规模会变大,遍历的计算开销则会增加,但好处是候选集中近邻点的召回率会提高;
在实际应用中,mmm 的取值、使用“与”还是“或”需要在准确率和召回率之间权衡。
1.3 LSH 的特点
LSH 是一种从海量的高维数据集中查找近似 KKK 近邻的方法,需要注意的是,LSH 并不能保证一定能查找到最相邻的数据,
2 局部敏感哈希的基本流程
2.1 离线建立索引
- 根据对准确率和召回率的需求,确定哈希函数的个数 mmm,以及每个哈希函数分桶的个数 www
- 选取 mmm 个满足 (d1,d2,p1,p2)(d_1,d_2,p_1,p_2)(d1,d2,p1,p2)-senstive 的哈希函数
- 将所有数据经过 LSH 哈希函数映射到相应的桶中,构成多个哈希表
2.2 在线查找
- 将查询数据经过 mmm 个哈希函数得到各个相应的桶号
- 根据“与”或者“或”操作对桶进行合并,获得最终的候选集
- 计算查询数据与候选集合中每个数据点之间的相似度或者距离,返回最近的 KKK 个近邻
从上面的流程可以看出,在线查找的时间包括两个部分:
- 步骤1中通过 LSH 哈希函数计算桶号的时间
- 步骤3中遍历所有候选点,计算与查询数据点距离的时间
3 不同距离度量下的 LSH
3.1 欧式距离
假设 vvv 是高维空间中的 kkk 维向量,rrr 是一个随机向量,则内积操作可以将 vvv 映射到一维空间:
h(v)=v⋅rh(v)=v\cdot rh(v)=v⋅r
因为一维空间也能部分保留高维空间的近似距离信息,因此就可以利用下面的哈希公式进行分桶:
hr,b(v)=⌊v⋅r+bw⌋h^{r,b}(v)=\lfloor \frac{v\cdot r + b}{w} \rfloorhr,b(v)=⌊wv⋅r+b⌋
其中,⌊⌋\lfloor \rfloor⌊⌋是向下取整操作,www 是分桶宽度,bbb 是 000 到 www 之间的一个均匀分布的随机变量,目的是避免分桶边界固化。
3.2 余弦距离
余弦距离衡量的是两个向量夹角的大小,夹角越小,则两个向量越相似。
基于余弦距离的 LSH 哈希函数为:
H(v)=sign(v⋅r)H(v)=sign(v\cdot r)H(v)=sign(v⋅r)
其中,rrr 是一个随机向量,v⋅rv\cdot rv⋅r 可以看作是将 vvv 向 rrr 上进行投影。
局部敏感哈希(Locality-Sensitive Hashing, LSH)相关推荐
- 局部敏感哈希-Locality Sensitive Hashing
局部敏感哈希 转载请注明http://blog.csdn.net/stdcoutzyx/article/details/44456679 在检索技术中,索引一直需要研究的核心技术.当下,索引技术主要 ...
- 局部敏感哈希Locality Sensitive Hashing归总
最近发邮件讨论Semantic Hashing的同学和同事很多,推荐李老师的文献列表供大家参阅:http://cs.nju.edu.cn/lwj/L2H.html 说到Hash,大家都很熟悉,是一种典 ...
- 局部敏感哈希(Locality sensitive hash) [3]—— 代码篇
我们在之前的文章中Locality Sensitive Hashing(局部敏感哈希)中已经详细的说了这个算法的基本核心思想,现在我们就来一点一点的把这个算法的每一步都来实现了. 首先我们至少得构建出 ...
- 局部敏感哈希算法(Locality Sensitive Hashing)
from:https://www.cnblogs.com/maybe2030/p/4953039.html 阅读目录 1. 基本思想 2. 局部敏感哈希LSH 3. 文档相似度计算 局部敏感哈希(Lo ...
- R语言实现︱局部敏感哈希算法(LSH)解决文本机械相似性的问题(一,基本原理)
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- 私认为,文本的相似性可以分为两类:一类是机械相 ...
- Locality Sensitive Hashing(局部敏感哈希)
文章目录 Background运用背景 Big pitcture 整体架构 定义 Surprising Property References # 写在前面的话 酱酱,又到了程序媛拯救世界的时间,程序 ...
- 【时序】Reformer:局部敏感哈希(LSH)实现高效 Transformer 论文笔记
论文名称:Reformer: The Efficient Transformer 论文下载:https://arxiv.org/abs/2001.04451 论文年份:ICLR2020 论文被引:70 ...
- 基于特征选择的局部敏感哈希位选择算法
点击上方蓝字关注我们 基于特征选择的局部敏感哈希位选择算法 周文桦, 刘华文, 李恩慧 浙江师范大学数学与计算机科学学院,浙江 金华 321001 摘要:作为主流的信息检索方法,局部敏感哈希往往需要生 ...
- 推荐系统局部敏感哈希解决Embedding最近邻搜索问题
文章目录 快速Embedding最近邻搜索问题 聚类.索引搜索最近邻 聚类搜索最近邻 索引搜索最近邻 局部敏感哈希及多桶策略 局部敏感哈希的基本原理 局部敏感哈希的多桶策略 局部敏感哈希代码实现 快速 ...
- 最近邻和K近邻及其优化算法LSH(局部敏感哈希,Locality Sensitive Hashing) Kd-Tree
引言 在处理大量高维数据时,如何快速地找到最相似的数据是一个比较难的问题.如果是低维的小量数据,线性查找(Linear Search)就可以解决,但面对海量的高维数据集如果采用线性查找将会非常耗时.因 ...
最新文章
- 换种监控姿势:基于深度学习+流处理的时序告警系统
- Nginx 日志中记录cookie
- 'adb' 不是内部或外部命令,也不是可运行的程序或批处理文件
- 一个简单的if else优化
- spring源码阅读(1/4) - Bean生成
- 前端学习(3271):js中this的使用
- 算法(24)-股票买卖
- android判断usb已连接,android 判断是否有网络连接(usb连接电脑问题)
- 训练日志 2019.1.13
- SpringCloud与Feign
- 系统设计(一)——Overview
- 发达国家“互联网+”面面观
- Win8串口驱动完美支持
- 反射+泛型+注解(demo)
- 韦东山学习笔记——UART(串口)的使用
- 金蝶苍穹,报表查询插件
- srm32f4按键蜂鸣器_STM32F407通过按键控制LED和蜂鸣器
- python数字精度自动变化_如何在python中将一个数字转换成12位精度?
- 不安分的 Go 强势入侵前端,后端难道要抢前端饭碗了?
- matlab toolbox 介绍,Matlab Robotic Toolbox使用简介(1)
热门文章
- 无线路由器dhcp服务器连接失败,TP-Link路由器桥接提示“获取IP地址失败,请检查DHCP是否开启”怎么办...
- 第四批入围企业公示——年度TOP100智能网联供应商评选
- 剑指 Offer II 075. 数组相对排序(中等 排序 数组)
- 【MySQL】MySQL的锁与事务隔离级别详解
- mysql_存储过程游标、循环
- 【Linux】【Shell】如何循环进入文件夹批量处理数据?批量修改文件的脚本
- 关系型数据库设计——银行业务管理系统
- 蚌埠学院教务系统自动导入课程表到小米/Redmi手机小爱同学课程表使用说明
- 关于打卡值班制度---一个excel开发工具小函数
- JSP基础之网站用户管理