局部敏感哈希(LocalitySensitiveHashing)和MinHash介绍与实例

更新时间:2023-07-19 10:08:16 阅读: 评论:0

局部敏感哈希(LocalitySensitiveHashing)和MinHash介绍与
实例
在实际应⽤中,我们所⾯对的数据是海量的,并且有着很⾼的维度。在对数据的各种操作中,查询操作是最常见的⼀种,这⾥的查询是指输⼊⼀个数据,查找与其相似的数据,那么怎样快速地从海量⾼维数据中,找到与某个数据最相似的数据,成为了⼀个难点和问题。
低维的⼩数据集,可通过线性查找来解决,但如果是对⼀个海量的⾼维数据集采⽤线性查找的话,时间代价⾮常⼤,因此,为了解决该问题,我们需要采⽤⼀些类似索引的技术来加快查找过程,通常这类技术称为最近邻查找或近似最近邻查找。局部敏感哈希就可以视为⼀种“近似最近邻查找”。
在介绍局部敏感哈希之前,需要先介绍传统的哈希算法。zubu
传统哈希算法通过哈希函数建⽴哈希表,由哈希表我们能够得到O(1)的查找时间性能,传统哈希算法的关键在于,找到合适的哈希函数,将原始数据映射到相对应的桶内,如果不同的数据,映射到了同⼀个位置,就是发⽣了冲突,这是传统哈希算法所要避免的。
⽽局部敏感哈希的思路恰恰想法,LSH渴望冲突,但是,不是没有限制的胡乱冲突,⽽是希望原先相邻的两个数据能够被映射到相同的桶内,具有相同的桶号,也就是说,将相似的数据聚到⼀起。
LSH算法基于⼀个假设,如果两个数据在原有的数据空间中是相似的,那么分别经过哈希函数映射以后的它们也具有很⾼的相似度;相反,如果它们本⾝是不相似的,那么经过映射后它们仍不具有相似性。
也就是说,将原始数据空间中的两个相邻数据点通过相同的映射后,这两个数据点在新的数据空间中仍然相邻的概率很⼤,⽽不相邻的数据点被映射到同⼀个桶的概率很⼩。
那么在实际使⽤中,我们只需要将查询数据进⾏哈希映射得到其桶号,然后取出该桶号对应桶内的所有数据,再进⾏线性匹配即可查找到与查询数据相邻的数据,极⼤的减少了时间代价。
局部敏感哈希的最⼤特点就在于保持数据的相似性。
我们可以看⼀个反例:
假设⼀个哈希函数为Hash(x) = x%9,那么我们现在有三个数据分别为356、359和814,我们将上述的三个数据通过Hash函数转换为:
Hash(356) = 356%9 =5 ;
Hash(359) = 359%9= 8;
Hash(814) = 814%9 = 4;
在未经过映射前,数据356和359⽐较接近,和814相差较远,但是在经过哈希映射之后,814的哈希值和356的哈希值接
近,359的哈希值和356的哈希值相差较远,也就是说,经过这种哈希计算后,数据之间原有的相似度消失,所以他不是⼀个局部敏感哈希。
那么,局部敏感哈希的哈希函数需要遵循什么样的原则呢?
四六级局部敏感哈希函数需要满⾜以下两个条件:
1)如果d(x,y) ≤ d1, 则h(x) = h(y)的概率⾄少为p1;
2)如果d(x,y) ≥ d2, 则h(x) = h(y)的概率⾄多为p2;
其中d(x,y)表⽰x和y之间的距离,d1 < d2, h(x)和h(y)分别表⽰对x和y进⾏hash变换。
满⾜以上两个条件的hash functions称为(d1,d2,p1,p2)-nsitive。⽽通过⼀个或多个(d1,d2,p1,p2)-nsitive的hash
function对原始数据集合进⾏hashing⽣成⼀个或多个hash table的过程称为Locality-nsitive Hashing 局部敏感哈希。
下⾯我们通过⼀个具体的实例,来介绍⼀下LSH的具体⽤法,“使⽤LSH实现⽂档相似度计算”。
假设现在有4个⽹页,我们将它们分别进⾏Shingling(将待查询的字符串集进⾏映射,映射到⼀个集合⾥。)得到如下的特征矩阵,每⼀列代表⼀个⽹页(⽂档),每⼀⾏可以视为⼀个字符,例如a,b,c,d,e,f,g。
其中“1”代表对应位置的Shingles在⽂档中出现过,“0”则代表没有出现过。
运⽤Jaccard相似度来衡量⽂档之间的相似性。接下来我们就要去找⼀种哈希函数,使得在hash后尽量还能保持这些⽂档之间
的Jaccard相似度,也就是说,这种哈希可以保持数据之间的相似性,那就可以视为局部敏感哈希。新gre考试时间
顺道提⼀下Jaccard(杰卡德)相似度。
Jaccard相似指数⽤来度量两个集合之间的相似性,它被定义为两个集合交集的元素个数除以并集的元素个数。
Jaccard距离⽤来度量两个集合之间的差异性,它是Jaccard的相似系数的补集,被定义为1减去Jaccard相似系数。
接下⾥,我们就要选择⼀个适当的哈希函数,令其满⾜局部敏感哈希的条件,在此处我们选⽤的哈希函数是MinHash,也就是最⼩哈希。
MinHash 是⽤于快速检测两个集合相似性的⽅法。该⽅法由 Andrei Broder (1997) 发明,最初⽤于AltaVista搜索引擎中来检测重复的⽹页。
MinHash定义为:特征矩阵按⾏进⾏⼀个随机的排列后,第⼀个列值为1的⾏的⾏号。
my family
⽐如我们原先有⼀个特征矩阵如下:S1,S2,S3为三个⽂档,A,B,C,D为四个字符。
接下来,我们按⾏做⼀个随机排列:
哈希值:排列转换后的⾏排列次序下第⼀个列值为1的⾏的⾏号,例如h(S1)=D,h(S2)=B。当然,你也可以记为
naico
h(S1)=2,h(S2)=1,h(s3)=2,两种表⽰⽅法应该都可⾏。
事实上,两个集合经随机排列之后得到的两个最⼩哈希值相等的概率等于这两个集合的Jaccard相似度。即P(h(Si)=h(Sj)) =教师节送给老师的诗
sim(Si,Sj)。
MinHash的基本原理:在A∪B这个⼤的随机域⾥,选中的元素落在A∩B这个区域的概率,这个概率就等于Jaccard的相似度
P(h(Si)=h(Sj)) 为什么会等于sim(Si,Sj)?
我们考虑Si和Sj这两列,它们所在⾏的所有可能结果可以分成如下三类:
(1)A类:两列的值都为1;
(2)B类:其中⼀列的值为0,另⼀列的值为1;
(3)C类:两列的值都为0.spiderweb
for的用法特征矩阵相当稀疏,导致⼤部分的⾏都属于C类,但只有A、B类⾏决定sim( Si , Sj ),假定A类⾏有a
个,B类⾏有b个,那么sim( si,sj )=a/(a+b)。
如果我们把C类⾏都删掉,那么第⼀⾏不是A类⾏就是B类⾏,如果第⼀⾏是A类⾏那么h(Si)=h(Sj),因此P( h(Si)=h(Sj) )=P(删
掉C类⾏后,第⼀⾏为A类)=A类⾏的数⽬/所有⾏的数⽬=a/(a+b)
所以,P(h(Si)=h(Sj)) = sim(Si,Sj)。
大连高端日语学校介绍完了jaccard相似度和MinHash,我们回到我们最初的⼯作,对原始特征矩阵做随机排序,计算每⼀个排序后每列的哈希值,⼀共做三次。
⽐如,第⼀次随机排序后,特征矩阵变成如下所⽰,可以求得该次随机排序后的最⼩哈希值。
环太平洋主题曲
那么,三次之后,我们得到如下⼀个矩阵,我们可以把它视为原始特征矩阵的⼀个压缩,或者说是降维。
最后我们需要验证的是,哈希过后的特征矩阵,是否保持了数据的相似性。相似度的计算结果如下表,所⽰,可以看出,极好的保留了相似性。
注:在原始数据相似度的计算中,去掉了C类数据,也就是都为0的数据。
这就是⼀个局部敏感哈希的例⼦,进⾏了数据的降维,之后查找所消耗的代价就⼤⼤减少了。
本⽂完。

本文发布于:2023-07-19 10:08:16,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/182070.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   相似   查找   矩阵   特征   集合   映射   相似性
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图