Minhash介绍


1.    minhash是用来降维的。用在两个事物相似度比较的场景。

2.    比较两个事物的相似度,通常是抽出事物的特征,然后两个事物的特征进行比较。例如s1(1,3,5),s2(2,3,5),交集/并集,算分。

3.    但如果事物特别多,并且特征也特别多,在计算上,工作量过大,于是想到降维,降低特征数。

4.    minhash认为,随机从特征中抽样一些来进行比较,和拿全部特征进行比较,在数学上,能得到一样的效果。

5.    抽特征的方法就是,首先把每一个特征映射为一个值。例如,把一个文档切词,压指纹。

6.    然后,建立一个特征和事物的矩阵,上侧是事物集合,左侧是特征集合。

7.    每一个文档用第一个有值的特征来表示,那么s1就是a,s2就是c,s3就是b,s4就是a。

8.    如果用a来表示事物s1,就有点太单薄了,太片面,毕竟它曾经只是s1的一个特征。所以就需要给s1多找几个特征,可第一个最小的特征值a已经用了,还想找第一个有值的,又不是a的特征怎么办呢。简单,对左列变换顺序,变成cdaeb,这时候,再按着第一个有值的特征来表示文档,那么s1就是d,s2就是c,s3就是d,s4就是c。汇总两次的hash结果,s1有特征a,d,表示为s1(a,d),s2(c),s3(b,d),s4(a,c)。

9.    随着特征集合顺序的变换,事物的minhash特征也越来也多,但总量小于原始的特征集合。(多了就没意义了)。相当于把原始的M个特征减少为N个特征。同时这个矩阵也不是稀疏矩阵了。做到了降维。

10. 那么剩下的问题就是变换矩阵行顺序的工作了。直接对矩阵进行改变肯定是工作量大的工作,但有个简单的办法,只排列行号,拿着新排列的行号去查找第一个有值特征也是一样的。排列行号的办法就是,找一个hash函数,对所有的行号求值,然后排序行号的hash值,就出现了一种新的排序。那么找N个hash函数对行号求值,就有了N个排列方式。有了N个排列方式,文档就有了N个特征。当然资料上这么说,我觉得整几个随机函数,把行号打乱的方式也一样。

还有一个方式,我没看懂,直接贴出来吧。

方法二 One-pass的实现

这样我们可以不去选择n个随机的排列,而是选择n个随机函数h1,h2...,hn,我们可以通过现在的顺序来构建签名矩阵,假设SIG(i,c)是签名矩阵的第i个hash函数和第c列,最初,我们设置所有的SIG(i,c)为无穷大,我们按照下面的方法来处理行r

1.计算h1(r),h2(r),...,hn(r)

2.对于所有的列c:

(a)如果(c,r)是0,不做任何操作

(b)如果(c,r)是1,那么对于i=1,2,...,n设置SIG(i,c)为当前的SIG(i,c)和hi(r)的最小值。

11.最后就有了一个N*事物数的矩阵,有了这个矩阵,再用simhash求相似度,就能找到相似的事物了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值