学习数据挖掘3 :MinHash算法

问题引入

在文本去重等任务中,衡量两个集合的相似度是非常重要的。如何衡量集合之间的相似度呢?两个集合 《学习数据挖掘3 :MinHash算法》 的相似度(Jaccard Index)定义为 《学习数据挖掘3 :MinHash算法》 。假设两个集合都是一个超集 《学习数据挖掘3 :MinHash算法》 的子集。如果一个个遍历超集 《学习数据挖掘3 :MinHash算法》 中的元素,确实可以确定出 《学习数据挖掘3 :MinHash算法》 来——因为我们可以确定下面的量:

《学习数据挖掘3 :MinHash算法》

于是 《学习数据挖掘3 :MinHash算法》

有没有更好的做法?

当超集中元素个数非常多时,上面的做法效率并不高,主要是因为严格统计,需要遍历超集 《学习数据挖掘3 :MinHash算法》 中的元素(至少需要遍历 《学习数据挖掘3 :MinHash算法》 中的元素)。所以为了提高效率,在误差允许范围内,可以考虑抽样的做法。注意一般情况 《学习数据挖掘3 :MinHash算法》

尝试1:从超集 《学习数据挖掘3 :MinHash算法》 中随机抽取 《学习数据挖掘3 :MinHash算法》 个元素,统计 《学习数据挖掘3 :MinHash算法》 。为了 《学习数据挖掘3 :MinHash算法》 足够大, 《学习数据挖掘3 :MinHash算法》《学习数据挖掘3 :MinHash算法》 几乎还在一个量级上,因为抽样次数 《学习数据挖掘3 :MinHash算法》

尝试2:每次从超集 《学习数据挖掘3 :MinHash算法》 中随机抽取1个元素,如果它不在 《学习数据挖掘3 :MinHash算法》 中,就继续抽取别的元素,直到新抽取的元素在 《学习数据挖掘3 :MinHash算法》《学习数据挖掘3 :MinHash算法》 中,结束抽取。结束前,抽取次数期望为 《学习数据挖掘3 :MinHash算法》 。这个随机过程终止于 《学习数据挖掘3 :MinHash算法》《学习数据挖掘3 :MinHash算法》 的概率分别为 《学习数据挖掘3 :MinHash算法》 。注意到终止于 《学习数据挖掘3 :MinHash算法》 的概率恰好等于 《学习数据挖掘3 :MinHash算法》 。我们多次进行上述实验,相当于对二项分布进行采样。为了估值准确,要进行多次实验,因此抽样次数 《学习数据挖掘3 :MinHash算法》

从复杂度(抽样次数)上,尝试一和尝试二是差不多的。尝试二优势在于误差小——尝试二直接对 《学习数据挖掘3 :MinHash算法》 进行估计,而尝试一相当于需要对 《学习数据挖掘3 :MinHash算法》 分别进行估计,并计算两者的比值(两个较小的数相除,这一步误差非常大!!!熟悉普物实验中误差传递的同学会心一笑 :P )。

尝试二中提到的方法,就是穿着马甲的MinHash算法。

首先,什么是Hash函数?

(这可能是个很蠢的问题,但小明确实啥都不会嘤嘤嘤……)

Hash函数是一个把大范围的数据映射到小范围的函数。比方说,商店里有三件商品,价格分别为99、199和299。我们是否需要开一个300维的数组 《学习数据挖掘3 :MinHash算法》 来存储这三件商品,使得 《学习数据挖掘3 :MinHash算法》 。答案是否定的。由于十位和个位都是9,因此我们可以只关注百位(0,1,2)。于是我们只需要一个三维的数组 《学习数据挖掘3 :MinHash算法》 使得 《学习数据挖掘3 :MinHash算法》。在这个例子中,将三位数 《学习数据挖掘3 :MinHash算法》 映射为 《学习数据挖掘3 :MinHash算法》 就是一个哈希函数。

一般来说,哈希函数的形式有:直接寻址法、数学分析法(上面的例子)、平方取中法、折叠法和随机数法、除留余数法。详见常见hash算法的原理

Hash函数有什么用呢?节省空间,便于存储——从更大范围数据变到更小范围了。

Hash函数的难点在哪?会出现冲突的问题。就像人名用全名很难冲突,但用小名或是”小张””老刘”之类的则容易产生冲突。无论是加密Hash算法还是查找Hash算法,减少冲突都是首要的任务,有二次散列等解决办法。这里不展开了(我也不会呀……)。

MinHash算法正式登场

MinHash算法一登场,就狠狠地打了脸,因为这里的哈希函数是0~n到0~n的随机排列映射,并不是从大范围映射到小范围。没关系,摸摸脸继续写。

尝试2中说每次从超集中随机抽取一个元素,直到满足 《学习数据挖掘3 :MinHash算法》 。这个说法其实等价于,先将超集中的元素随机排列成一个列表,然后从上往下读,直到读到 《学习数据挖掘3 :MinHash算法》 。后者就是MinHash算法的核心做法。不过交换行的内容比较麻烦,相对地,我们交换行号。所以实际上,我们是通过打擂法确定的最小满足 《学习数据挖掘3 :MinHash算法》 的行号的。例子可以参见——文本去重之MinHash算法

    原文作者:善良的摩羯小明
    原文地址: https://zhuanlan.zhihu.com/p/42814338
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞