局部敏感哈希
下面内容参考了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大致分为以下三个步骤
- Shingling: 将document转化为sets
- Min-Hashing:将维度较高的sets转化为signature,同时保证两个不同的signature相似的概率和sets相似的概率正相关。
- 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