超详细好懂的min-hash算法介绍[三]

1,840 阅读5分钟

这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战

超详细好懂的min-hash算法介绍[一]

超详细好懂的min-hash算法介绍[二]

超详细好懂的min-hash算法介绍[三]

最小哈希操作

想象一个由我们需要对比的原始集合按列组成的矩阵,将这个矩阵按行打乱排序P次,在每一次打乱之后,找出每个集合(即矩阵的列向量)的第一个值为1的行索引,并将这个索引分别填充进一个新的集合中(每个原始集合拥有各自的一个新的集合),这个新的集合就是原始集合的哈希签名。用公式表达如下:

sig(Ci)=PCi列每次打乱后第一个值为1的行索引值(3)sig(C_i)=P个C_i列每次打乱后第一个值为1的行索引值 \tag 3

上述操作即为最小哈希操作,或许你现在还是有些迷糊,没事,我们来看一个例子。

(以下示例来源Stanford University

  1. 假设有三个需要对比的(5,)原始集合Ci,首先将他们按列组合成一个(5,3)的矩阵,其中Ri表示行号:
  1. 假设我们希望将之降维至3维,即将原始集合Ci降维至(3,),则将P设为3,即进行三次按行乱序:
第一次排序中,我们仍按(12345)的行顺序排序,此时C1的第一个1出现在R1,于是我们将1添加到原始集合C1的数字签名S1中。其他两个集合同理。

第二次排序中,我们按照(54321)的行顺序排序,此时C1的第一个1出现在R4,于是我们再将4添加到原始集合C1的数字签名S1中。其他两个集合同理。

第三次排序操作同第一、二次操作。

2. 最后,我们计算对Ci进行min-hash操作后得到的数字签名Si的Jacarrd系数,得到集合之间的相似度(下图Col_Col是原始集合的Jaccard系数,Sig-Sig是哈希签名的Jaccard系数,也就是原始集合的min-hash系数):

大家应该很容易发现,我们在上述例子中计算出的集合的Jaccard系数与min-hash系数只能说比较接近,但不能说完全一致。这是由于本例中的三个原始集合维度本身也不高,仅有5维,在实际的应用中,我们所面对的集合通常是成百万上千万维的,在宏观的角度下,或者说从统计上来讲,min-hash系数是等于Jaccard系数的。这就引出了上一节留下的问题:凭什么认为完成了最小哈希操作后的集合之间的Jaccard距离与原始集合之间的Jaccard距离还是相等的呢? 对于该疑问,我们证明如下:

首先,由Jaccard系数的定义我们可以知道,Jaccard系数其实就是找出两个集合中,相等元素(两个集合交集)占所有元素(两个集合并集)的比例。

现仅考虑集合C1和C2,那么这两列集合的相同的每一行会有下面3种情况:

  1. C1和C2在该行的值都为1,我们将这种情况的次数记为X
  2. C1和C2的其中一个在该行的值为1,另一个值为0,我们将这种情况的次数记为记为Y
  3. C1和C2的值都为0,这种情况的次数记为Z

很显然,第一种情况X代表了集合C1和C2的交集,X+Y则代表了C1和C2的并集,

即此时Jaccard(C1,C2) = X/(X+Y)

接下来计算min-hash(C1,C2),也就是P[min-hash(C1)=min-hash(C2)]。经过随机行打乱后,从上往下扫描,在碰到Y行之前碰到X行的概率为X/(X+Y),即min-hash(C1)=min-hash(C2)的概率为X/(X+Y)。

为什么我们计算的是”从上往下扫描,在碰到Y行之前碰到X行的概率“呢?还记得我们是要把什么添加进原始集合的哈希签名中吗?

(以上证明参考了Stanford University戴思达的该篇文章

该证明是稍微有一些难以理解的,斯坦福大学的教学PPT里甚至直接用”Suprising Property“来描述这个性质。虽然其对概率论的知识储备有一定的要求,但我相信各位稍加思考应该能够理解,如果有任何的问题都可以在评论区留言,抑或是直接私信我。

好了,我们对于min-hash算法的讲解到这里就结束了...吗?并没有。还记得我们使用min-hash算法的目的吗?降维!而在这里降维是为了什么?降低计算复杂度! 然而我们现在面临一个问题,打乱矩阵之后得到哈希签名完成降维,之后再计算相似度确实降低了计算复杂度,但是将矩阵打乱排序本身也是一个计算复杂度相当高的操作!

因此,在下一节中,我们将介绍真正实际应用的min-hash算法!大家也不要觉得这一节白学(不要白学)了,实际应用的min-hash算法也是基于本节知识的。下一节再见!