转载http://roba.rushcj.com/?p=533&cpage=1#comment-5985
读书笔记:相似度计算(1)
所谓minhash是指把一个集合(即特征矩阵的一列)映射为一个0..R-1之间的值。具体方法是,以等概率随机抽取一个0..R-1的排列,依此排列查找第一次出现1的行。
例如有集合S1={a,d}, S2={c}, S3 = {b,d,e}, S4 = {a,c,d},特征矩阵即如下
S1 S2 S3 S4
0a 1 0 0 1
1b 0 0 1 0
2c 0 1 0 1
3d 1 0 1 1
4e 0 0 1 0
设随机排列为43201(edcab),按edcab的顺序查看S1列,发现第一次出现1的行是d(即第3行),所以h(S1) = 3,同理有h(S2)=2, h(S3)=4, h(S4)=3。
此处有一重要而神奇的结论:对于等概率的随机排列,两个集合的minhash值相同的概率等于两个集合的Jaccard相似度。
证明:同一行的两个元素的情况有三种:X.两者都为1;Y.一个1一个0;Z.两者都为0。易知Jaccard相似度为|X|/(|X|+|Y|)。另一方面,若排列是等概率的,则第一个出现的X中元素出现在Y中元素之前的概率也为|X|/(|X|+|Y|),而只有这种情况下两集合的minhash值相同。
于是方法就有了,我们多次抽取随机排列得到n个minhash函数h1,h2,…,hn,依此对每一列都计算n个minhash值。对于两个集合,看看n个值里面对应相等的比例,即可估计出两集合的Jaccard相似度。可以把每个集合的n个minhash值列为一列,得到一个n行C列的签名矩阵。因为n可远小于R,这样我们就把集合压缩表示了,并且仍能近似计算出相似度。
在具体的计算中,可以不用真正生成随机排列,只要有一个hash函数从[0..R-1]映射到[0..R-1]即可。因为R是很大的,即使偶尔存在多个值映射为同一值也没大的影响。
本文深入探讨了MinHash算法及其如何应用于快速估算集合间的Jaccard相似度,通过实例演示了MinHash的计算过程,并解释了其背后的数学原理。
525

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



