MinHashing原理

本文深入探讨了MinHash算法及其如何应用于快速估算集合间的Jaccard相似度,通过实例演示了MinHash的计算过程,并解释了其背后的数学原理。

转载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是很大的,即使偶尔存在多个值映射为同一值也没大的影响。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值