局部敏感哈希,基于Jaccard距离

局部敏感哈希

下面内容参考了stanford的公开课
https://myslide.cn/slides/12108 这是ppt链接
这是公开课链接 https://www.youtube.com/watch?v=e8dA0tscrCM

简介

  • 适用场景:
    Find near-neighbors in high-dim. space
    We formally define “near neighbors” as points that are a “small distance” apart.
    给一个好理解的例子:给定d维空间中的n个点,构建一个数据结构使用 O(n)的空间,使得给定一个查询点,该数据结构能尽可能快地找到离查询点欧氏距离最近的点。 这就是LSH(Locality sensitive Hashing)能够解决的问题。

定义

距离的定义

不难理解,在不同的距离的定义下,两个点之间的距离可以是不同的。以下内容基于Jaccard distance展开。
在这里插入图片描述

流程

LSH大致分为以下三个步骤在这里插入图片描述

  1. Shingling: 将document转化为sets
  2. Min-Hashing:将维度较高的sets转化为signature,同时保证两个不同的signature相似的概率和sets相似的概率正相关。
  3. Locality-Sensitve Hashing: 将可能相似的signature挑选出来,称为candidate pairs。(其中的步骤体现Locality sensitive)

Shingling

将ducument用词袋模型提取出sets:
k-shingle就是将document中k个连续的token作为一个元素提出出来,所有的元素构成document对应的集合。
其中,token可以是character也可是word, set也可以是multiset。
在这里插入图片描述
当所有文章都转换成集合以后,所有集合中的元素的并集,就是所有的shingles,如果将每一个document转换出的set作为一个列向量,包含的元素对应的shingle记为1,不包含记为0,可以构造出documents对应的shingles的矩阵。
在这里插入图片描述
下一个目标是从这些列向量中寻找相似的pairs。
用sim(C1,C2)表示文档之间的Jaccard 相似度
用d(C1,C2)表示文档之间的距离
那么d(C1,C2) = 1 - sim(C1,C2)
例如上图中,从左数第一列和第二列的sim是3/6,d是1-3/6

如果对于每两个document都计算距离,计算量太大了,所以用Min-hashing近似计算。

Min-hashing

目标:寻找一个哈希函数,满足sim(A,B)很高的时候 h(A)和h(B)也高概率相等;并且sim(A,B)很低的时候 h(A)和h(B)也高概率不相等。

哈希函数的设计思路:

  • 将矩阵对于行进行随机重排(random permutation)
  • 将每一列中的第一个非0符号作为该列的哈希值
  • 进行多次随机重排获得signature
  • 随机重排的实现基于哈希函数(毕竟随机重排复杂度太高,但是设计比较好的哈希函数可降低时间复杂度并达到相同效果)

Min-hashing正确性这里不证明了,感兴趣自行google

在这里插入图片描述
举一个例子
在这里插入图片描述
具体实现随机重排的哈希函数:
h(x) = ((ax+b) mod p) mod N
p是大于N的素数
N是行数
a b是整数

LSH

  • 将矩阵M分成b个band
  • 每一个band都是r行
  • 对每一个band,进行哈希,将每一列都映射到1个bucket中,一共有k个bucket,k越大越好
  • 在这里插入图片描述
    相当于将每一个band都建立一个哈希表(k个buckets),一共需要建立b个哈希表,只要某一个band的哈希表中有一个bucket中同时包含两个元素,就认为它们是candidata pair。

b和r的选取很关键
假设文档对应的column C和column D 相似度为t
选取任意band(r 行)
r行相等的概率是 tr
r行中存在不想等的行的概率是 1 - tr

所以对于2个文档,它们不是candidate pair的概率是b个band都不相等的概率,即(1-tr)b
所以至少一个band相等的概率是1-(1-tr)b
在这里插入图片描述
上图中x轴是t,y轴是两个文档在同一个bucket的概率,红色是对应曲线

假设两者应该是线性相关,画出黑色斜线表示,图中文字计算了两者的焦点。b和r的选择可以由此得出。

再看下图,假定相似度大于0.6的就认为是相似文档,下图画出出现错误判断FN和FP的概率。在这里插入图片描述

下面给出博主实现的LSH的c++源代码,包含说明文档和实现报告。
https://github.com/Ethan00Si/algorithms-for-massive-data/tree/master/Week12_instructions/2018202181

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值