Minhash算法直观理解
作者: @凌漪_ @板烧鱼仔 @Yuxn.
背景
- Jaccard相似度
两个集合 A 和 B,我们关心它们的Jaccard相似度
J ( A , B ) = ∣ A ∩ B ∣ ∣ A ∪ B ∣ J(A,B)=\frac{∣A∩B∣}{∣A∪B∣} J(A,B)=∣A∪B∣∣A∩B∣
Jaccard相似度描述了两个集合之间的相似程度。
使用场景1:两个文档之间的相似度。注意: jaccard相似度并没有提取文档的任何语义,只是在查看它们是否包含相同的单词。因此,“大王八”和“八大王”的jaccard相似度为1。在计算文档之间的相似度时,通常不会基于词级别,而是n-gram(n个连续单词),再计算交集和并集的元素的个数,得到jaccard相似度。
使用场景2:你的歌单和我的歌单之间的相似度 - 计算Jaccard效率低下
当拥有一个大型的文档集合时(比如里面有N篇文档),我们需要找出其中相似度高的文档对。此时就需要对文档进行来两两比较,计算Jaccard,得到一个 N ∗ N N * N N∗N的矩阵。(当然,为了避免重复进行2次计算:文档A与文档B,文档B与文档A,其中有一半上三角的值为0),所需要的比较次数为 ( N 2 ) / 2 N^2) /2 N2)/2,计算复杂度为 O ( N 2 ) O(N^2) O(N2)。而在每次进行jaccard比较时,需要交集和并集,计算复杂度取决于文档的大小,假设所有文档的长度相等,都包含M个单词,则计算复杂度为 O ( N 2 ⋅ M ) O(N^2 · M) O(N2⋅M)。就会耗费很长时间,计算和内存消耗变得不可承受 - Jaccard的计算替代方式:Minhash算法
Minhash的好处:Minhash可以实现把一篇文章用一个较短的signature表示,这个signature有个很好的性质: 两个minhash signature的Jaccard相似度和原始文本的Jaccard相似度在概率上是一致的。 比较一次的所耗费的时间为numHash,总的计算复杂度为 O ( N 2 ⋅ n u m H a s h ) O(N^2 · numHash) O(N2⋅numHash)。而numHash是可以自己设置的大小,这就远小于M。
minhash如何工作?
先介绍它的工作方式,可能能帮助你更好理解这个算法。
前提假设:如果两个集合非常相似 → 那么对这两个集合应用同一种变化,得到的变化结果也很相似 → 对这两个变化结果选取某种特征(比如选最小值),它们有很高的概率是相等的。
- 假设我们拥有2个集合
# 设置2个集合A和B
A = {
1, 2, 3, 4, 5}
B = {
3


2117

被折叠的 条评论
为什么被折叠?



