这是我参与11月更文挑战的第6天,活动详情查看:2021最后一次更文挑战
实际应用的min-hash算法
在上一节中我们提到,将矩阵按行打乱排序是一个计算复杂度相当高的操作。因此,我们要将min-hash算法投入实际应用,就必须要找出另一种哈希函数来替代打乱排序的操作,作为新的最小哈希操作来得到哈希签名。那么,实际应用中采取的都是什么方法呢?这便是本节我们要介绍的内容。
在实际应用中,通常是使用一组具有很好的均匀性的随机映射哈希函数,对原始集合的每一个元素作哈希运算,在使用每个哈希函数对整个集合做完一次哈希运算后,就将结果集合中的最小值挑选出来,添加进新的集合中。在这一组哈希函数都分别对整个集合做完哈希运算后,得到的新的集合就是我们的哈希签名。
例如,我们有一组哈希函数hi(xj) ,hi表示一组哈希函数(假设为k个),xj表示我们需要计算哈希签名的集合中的元素。首先使用h1对集合中所有元素进行哈希运算,然后选出其中的最小值添加进一个新的集合中。接下来使用h2重复上述操作,也将结果中的最小值添加进这个新的集合,一直到hk结束,我们的新的集合中就有了k个元素,这个新的集合就是我们的哈希签名,上述操作就是我们新的最小哈希操作。
上面只是简单的说明了实际应用中的思路,然而我们现在还需要解决如下问题:
- 原始集合经过这个新的最小哈希操作后的哈希签名之间的相似度还和原始集合一样吗?
- 如何去选取这样的一组哈希函数呢?
现在,让我们先来解决第一个问题。
假设我们有C1、C2两个需要计算相似度的集合,那么分别对其记为对其进行一次最小哈希操作,得到的值记为min-hash(C1)与min-hash(C2)。由于随机的等概率性,那么min-hash(C1)与min-hash(C2)相等的概率等于
上述公式你可以从这个角度来理解,使用同一个哈希函数对集合C1、C2进行最小哈希运算(注意这里是运算而非操作),得到的所有结果,即集合中集合C1、C2合集中的最小值所属对应的元素属于两个集合的交集的概率即是。
好了,证明了第一个问题,我们接下来解决第二个问题:如何去选取这样的一组哈希函数。
事实上,基于经验,我们通常使用以下公式,通过直接改变系数,来得到需要数量的哈希函数:
实际应用中,我们可以通过调整两个coe系数,以及mod,共计三个参数的大小,来得到无限多的哈希函数。
好了,对于min-hash算法的介绍到这里就真的结束了,下一节中,我们将给出一个实际的代码示例,以加深大家对它的理解。