上一节,我们分析了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||

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算法初探的更多相关文章

  1. OpenStack_Swift源代码分析——Ring的rebalance算法源代码具体分析

    1 Command类中的rebalnace方法 在上篇文章中解说了,创建Ring已经为Ring加入设备.在加入设备后须要对Ring进行平衡,平衡 swift-ring-builder object.b ...

  2. Openck_Swift源代码分析——添加、删除设备时算法详细的实现过程

    1 初始加入设备后.上传Object的详细流程  前几篇博客中,我们讲到环的基本原理即详细的实现过程,加入我们在初始创建Ring是执行例如以下几条命令: •swift-ring-builder obj ...

  3. STL源代码分析——STL算法remove删除算法

    前言 因为在前文的<STL算法剖析>中,源代码剖析许多.不方便学习,也不方便以后复习,这里把这些算法进行归类.对他们单独的源代码剖析进行解说.本文介绍的STL算法中的remove删除算法. ...

  4. STL源代码分析——STL算法merge合并算法

    前言 因为在前文的<STL算法剖析>中.源代码剖析许多.不方便学习.也不方便以后复习,这里把这些算法进行归类.对他们单独的源代码剖析进行解说.本文介绍的STL算法中的merge合并算法. ...

  5. STL源代码分析——STL算法sort排序算法

    前言 因为在前文的<STL算法剖析>中,源代码剖析许多,不方便学习,也不方便以后复习.这里把这些算法进行归类,对他们单独的源代码剖析进行解说.本文介绍的STL算法中的sort排序算法,SG ...

  6. 变动性算法源代码分析与使用示例(copy_backward、 transform、 replace_copy_if 等)

    首先回顾前面的文章,我们把for_each 归类为非变动性算法,实际上它也可以算是变动性算法,取决于传入的第三个参数,即函数 指针.如果在函数内对容器元素做了修改,那么就属于变动性算法. 变动性算法源 ...

  7. K-近邻算法的Python实现 : 源代码分析

    网上介绍K-近邻算法的样例非常多.其Python实现版本号基本都是来自于机器学习的入门书籍<机器学习实战>,尽管K-近邻算法本身非常easy,但非常多刚開始学习的人对其Python版本号的 ...

  8. 位姿检索PoseRecognition:LSH算法.p稳定哈希

    位姿检索使用了LSH方法,而不使用PNP方法,是有一定的来由的.主要的工作会转移到特征提取和检索的算法上面来,有得必有失.因此,放弃了解析的方法之后,又放弃了优化的方法,最后陷入了检索的汪洋大海. 0 ...

  9. redis 源代码分析(一) 内存管理

    一,redis内存管理介绍 redis是一个基于内存的key-value的数据库,其内存管理是很重要的,为了屏蔽不同平台之间的差异,以及统计内存占用量等,redis对内存分配函数进行了一层封装,程序中 ...

随机推荐

  1. PreTranslateMessage和TranslateMessage区别(转)

    PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的,绝大多数本窗口的消息都要通过这里,比较常用,当需要在MFC之前处理某些消息时,常常要在这里添加代码. ...

  2. Hadoop2.6 Ha 安装

    Hadoop 2.6安装文档 版本说明:hadoop 2.6  linux-64位 Zookeeper3.4.6 jdk 1.7.0_75 1.       Ssh无密码 ssh-keygen vim ...

  3. .net MVC 使用 JSON JavaScriptSerializer 进行序列化或反序列化时出错,字符串的长度超过了为 maxJsonLength 属性设置的值

    在.net mvc的controller中,方法返回JsonResult,一般我们这么写: [HttpPost] public JsonResult QueryFeature(string url, ...

  4. 在 Azure 网站上使用 Memcached 改进 WordPress

    编辑人员注释:本文章由 Windows Azure 网站团队的项目经理 Sunitha Muthukrishna 和 Windows Azure 网站开发人员体验合作伙伴共同撰写. 您是否希望改善在 ...

  5. 包子IT面试培训

    包子IT面试培训 IT 面试不再怕,包子帮你圆个梦!

  6. 1245 - Harmonic Number (II)(规律题)

    1245 - Harmonic Number (II)   PDF (English) Statistics Forum Time Limit: 3 second(s) Memory Limit: 3 ...

  7. POJ 1330 Nearest Common Ancestors LCA题解

    Nearest Common Ancestors Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 19728   Accept ...

  8. QT 入门 -QApplication QPushButton QDialog Ui类型的手工使用

    QT 1.工具 assistant  帮助文档 qtconfig  QT配置工具 qmake     QT的make与项目文件智能创建工具 uic          UI界面的设计文件的编译工具 mo ...

  9. A. Case of the Zeros and Ones----解题报告

    A. Case of the Zeros and Ones Description Andrewid the Android is a galaxy-famous detective. In his ...

  10. python学习(2)

    编码: 需要注意的是:python 没有字符的概念,但是比如a='abcd',当中字母a占用一个字节,通过 方法len我们可以求出这个字符变量a所有字符个数,如:print len(a)显示结果为:4 ...