【E2LSH源代码分析】p稳定分布LSH算法初探
上一节,我们分析了LSH算法的通用框架,主要是建立索引结构和查询近似近期邻。这一小节,我们从p稳定分布LSH(p-Stable LSH)入手,逐渐深入学习LSH的精髓,进而灵活应用到解决大规模数据的检索问题上。
相应海明距离的LSH称为位採样算法(bit sampling),该算法是比較得到的哈希值的海明距离,可是一般距离都是用欧式距离进行度量的,将欧式距离映射到海明空间再比較其的海明距离比較麻烦。于是,研究者提出了基于p-稳定分布的位置敏感哈希算法,能够直接处理欧式距离,并解决(R,c)-近邻问题。
1、p-Stable分布
定义:对于一个实数集R上的分布D,假设存在P>=0,对不论什么n个实数v1,…,vn和n个满足D分布的变量X1,…,Xn,随机变量ΣiviXi和(Σi|vi|p)1/pX有同样的分布,当中X是服从D分布的一个随机变量,则称D为
 一个p稳定分布。
对不论什么p∈(0,2]存在稳定分布:
p=1是柯西分布,概率密度函数为c(x)=1/[π(1+x2)];
p=2时是高斯分布,概率密度函数为g(x)=1/(2π)1/2*e-x^2/2。
利用p-stable分布能够有效的近似高维特征向量,并在保证度量距离的同一时候,对高维特征向量进行降维,其关键思想是,产生一个d维的随机向量a,随机向量a中的每一维随机的、独立的从p-stable分布中产生。对于一个d维的特征向量v,如定义,随机变量a·v具有和(Σi|vi|p)1/pX一样的分布,因此能够用a·v表示向量v来估算||v||p 。
2、p-Stable分布LSH中的哈希函数
p-Stable分布的LSH利用p-Stable的思想,使用它对每个特征向量v赋予一个哈希值。该哈希函数是局部敏感的,因此假设v1和v2距离非常近,它们的哈希值将同样,并被哈希到同一个桶中的概率会非常大。
依据p-Stable分布,两个向量v1和v2的映射距离a·v1-a·v2和||v1-v2||pX 的分布是一样的。
a·v将特征向量v映射到实数集R,假设将实轴以宽度w等分,并对每一段进行标号,则a·v落到那个区间,就将此区间标号作为哈希值赋给它,这样的方法构造的哈希函数对于两个向量之间的距离具有局部保护作用。
哈希函数格式定义例如以下:
ha,b(v):Rd->N,映射一个d维特征向量v到一个整数集。哈希函数中又两个随机变量a和b,当中a为一个d维向量,每一维是一个独立选自满足p-Stable的随机变量,b为[0,w]范围内的随机数,对于一个固定的a,b,则哈希函数ha,b(v)为
图1 p-Stable LSH在二维空间的演示样例
3、特征向量碰撞概率
随机选取一个哈希函数ha,b(v),则特征向量v1和v2落在同一桶中的概率该怎样计算呢?
首先定义c=||v1-v2||p,fp(t)为p-Stable分布的概率密度函数的绝对值,那么特征向量v1和v2映射到一个随机向量a上的距离是|a·v1-a·v2|<w,即|(v1-v2)·a|<w,依据p-Stable分布的特性,||v1-v2||pX=|cX|<w,当中随机变量X满足p-Stable分布。
可得其碰撞概率p(c):
 
依据该式,能够得出两个特征向量的冲突碰撞概率随着距离c的添加而减小。
4、p-Stable分布LSH的相似性搜索算法
经过哈希函数哈希之后,g(v)=(h1(v),...,hk(v)),但将(h1(v),...,hk(v))直接存入哈希表,即占用内存,又不便于查找,为解决此问题,现定义另外两个哈希函数:
因为每个哈希桶(Hash Buckets)gi被映射成Zk,函数h1是普通哈希策略的哈希函数,函数h2用来确定链表中的哈希桶。
(1)要在一个链表中存储一个哈希桶gi(v)=(x1,...,xk)时,实际上存的不过h2(x1,...,xk)构造的指纹,而不是存储向量(x1,...,xk),因此一个哈希桶gi(v)=(x1,...,xk)在链表中的相关信息仅有标识(identifier)指纹h2(x1,...,xk)和桶中的原始数据点。
(2)利用哈希函数h2,而不是存储gi(v)=(x1,...,xk)的值有两个原因:首先,用h2(x1,...,xk)构造的指纹能够大大降低哈希桶的存储空间;其次,利用指纹值能够更快的检索哈希表中哈希桶。通过选取一个足够大的值以非常大的概率来保证随意在一个链表的两个不同的哈希桶有不同的h2指纹值。
图2 桶哈希策略示意图
5、不足与缺陷
LSH方法存在双方面的不足:首先是典型的基于概率模型生成索引编码的结果并不稳定。尽管编码位数添加,可是查询准确率的提高确十分缓慢;其次是须要大量的存储空间,不适合于大规模数据的索引。E2LSH方法的目标是保证查询结果的准确率和查全率,并不关注索引结构须要的存储空间的大小。E2LSH使用多个索引空间以及多次哈希表查询,生成的索引文件的大小是原始数据大小的数十倍甚至数百倍。
转载请注明作者及文章出处:http://blog.csdn.net/jasonding1354/article/details/38237353
參考资料:
1、王旭乐.基于内容的图像检索系统中高维索引技术的研究[D].华中科技大学.2008
2、M.Datar,N.Immorlica,P.Indyk,and V.Mirrokni,“Locality-SensitiveHashing Scheme Based on p-Stable Distributions,”Proc.Symp. ComputationalGeometry, 2004.
3、A.Andoni,“Nearest Neighbor Search:The Old, theNew, and the Impossible”PhD dissertation,MIT,2009.
4、A.Andoni,P.Indyk.E2lsh:Exact Euclidean locality-sensitive hashing.http://web.mit.edu/andoni/www/LSH/.2004.
【E2LSH源代码分析】p稳定分布LSH算法初探的更多相关文章
- OpenStack_Swift源代码分析——Ring的rebalance算法源代码具体分析
		1 Command类中的rebalnace方法 在上篇文章中解说了,创建Ring已经为Ring加入设备.在加入设备后须要对Ring进行平衡,平衡 swift-ring-builder object.b ... 
- Openck_Swift源代码分析——添加、删除设备时算法详细的实现过程
		1 初始加入设备后.上传Object的详细流程 前几篇博客中,我们讲到环的基本原理即详细的实现过程,加入我们在初始创建Ring是执行例如以下几条命令: •swift-ring-builder obj ... 
- STL源代码分析——STL算法remove删除算法
		前言 因为在前文的<STL算法剖析>中,源代码剖析许多.不方便学习,也不方便以后复习,这里把这些算法进行归类.对他们单独的源代码剖析进行解说.本文介绍的STL算法中的remove删除算法. ... 
- STL源代码分析——STL算法merge合并算法
		前言 因为在前文的<STL算法剖析>中.源代码剖析许多.不方便学习.也不方便以后复习,这里把这些算法进行归类.对他们单独的源代码剖析进行解说.本文介绍的STL算法中的merge合并算法. ... 
- STL源代码分析——STL算法sort排序算法
		前言 因为在前文的<STL算法剖析>中,源代码剖析许多,不方便学习,也不方便以后复习.这里把这些算法进行归类,对他们单独的源代码剖析进行解说.本文介绍的STL算法中的sort排序算法,SG ... 
- 变动性算法源代码分析与使用示例(copy_backward、 transform、 replace_copy_if 等)
		首先回顾前面的文章,我们把for_each 归类为非变动性算法,实际上它也可以算是变动性算法,取决于传入的第三个参数,即函数 指针.如果在函数内对容器元素做了修改,那么就属于变动性算法. 变动性算法源 ... 
- K-近邻算法的Python实现 : 源代码分析
		网上介绍K-近邻算法的样例非常多.其Python实现版本号基本都是来自于机器学习的入门书籍<机器学习实战>,尽管K-近邻算法本身非常easy,但非常多刚開始学习的人对其Python版本号的 ... 
- 位姿检索PoseRecognition:LSH算法.p稳定哈希
		位姿检索使用了LSH方法,而不使用PNP方法,是有一定的来由的.主要的工作会转移到特征提取和检索的算法上面来,有得必有失.因此,放弃了解析的方法之后,又放弃了优化的方法,最后陷入了检索的汪洋大海. 0 ... 
- redis 源代码分析(一) 内存管理
		一,redis内存管理介绍 redis是一个基于内存的key-value的数据库,其内存管理是很重要的,为了屏蔽不同平台之间的差异,以及统计内存占用量等,redis对内存分配函数进行了一层封装,程序中 ... 
随机推荐
- 猪猪的机器学习笔记(十七)隐马尔科夫模型HMM
			隐马尔科夫模型HMM 作者:樱花猪 摘要: 本文为七月算法(julyedu.com)12月机器学习第十七次课在线笔记.隐马尔可夫模型(Hidden Markov Model,HMM)是统计模型,它用来 ... 
- JavaSE学习总结第16天_集合框架2
			16.01 ArrayList存储字符串并遍历 ArrayList类概述:底层数据结构是数组,查询快,增删慢,线程不安全,效率高 ArrayList类是List 接口的大小可变数组的实现.实现了所 ... 
- Intellij IDEA 常用 设置 及 快捷键 (持续更新)
			Transparent native-to-ascii conversion以下设置都可以通过 设置中的搜索框 进行关键字搜索 0, 打开Project 设置 Command + ; 1, 打开Mod ... 
- 如何使用SublimeText风格的代码高亮样式  添加Zed Coding(EMMET)插件
			因为觉得博客园自带的代码高亮样式很单一,不符合作为前端的我的审美习惯,于是下定决心要想办法折腾出一个方法来应用上另外一套代码高亮样式. 虽然探索的过程是很痛苦的,但最后还是成功了,但也不枉付出的那些努 ... 
- JS实现常用的分享到按钮
			我们阅读博客的时候经常会用到这样功能,当然有时候也会想把自己的网站上也加入类似的分享功能,各大厂商已经给出了相应的API,点击一个按钮即可弹出窗口进入分享,我们事先可以设置一些参数,一般常用的就是 网 ... 
- Windows Phone 8初学者开发—第1部分:系列介绍
			原文 Windows Phone 8初学者开发—第1部分:系列介绍 您好,欢迎来到这个包含35课为Window Phone 8平台创建应用程序的系列教程.我叫Bob Tabor,在过去的11年中我一直 ... 
- vs2010 调试 调用堆栈 窗口
			msdn 如何使用call stack窗口: http://msdn.microsoft.com/zh-cn/library/a3694ts5(v=vs.90).aspx 使用“调用堆栈”窗口可以查看 ... 
- Effective C++:条款37:绝不又一次定义继承而来的缺省參数值
			因为又一次定义继承而来的non-virtual函数是不对的(见上一个条款),所以这个条款就将问题局限于:绝不又一次定义继承一个带有缺省參数值的virtual函数. (一) virtual函数是动态绑定 ... 
- iOS 最新UIAlertController
			iOS 8的新特性之一就是让接口更有适应性.更灵活,因此许多视图控制器的实现方式发生了巨大的变化.全新的UIPresentationController 在实现视图控制器间的过渡动画效果和自适应设备尺 ... 
- 驱动:中断【2】中断处理程序、中断上下文中处理延时及一些函数的调用规则(调IIC中断驱动有感)
			中断处理程序.中断上下文中处理延时及一些函数的调用规则(调IIC中断驱动有感)http://blog.csdn.net/samantha_sun/article/details/6790492 1,中 ... 
