MinHash (最小哈希)

原载:http://cool.sinaapp.com
作者:junGle
原文网址:http://1.cool.sinaapp.com/?p=893


minhash是判断文档相似的一种方法。这里结合一个具体的示例来简单过一下:

一、全集

{a,b,c,d,e},S1={a,d}, S2={c}, S3={b,d,e}, S4={a,c,d}。

具体含义:比如  S1,S2,S3,S4分别是4个文档,a,b,c,d,e可以是相应的文档特征(分词、singling切片等)。

二、特征矩阵
【原始行排列-abcde】

三、minhash

构建这样一个签名指纹,由大量计算结果组成,每次计算特征矩阵的最小哈希。

处理:

【行排列转换】  beadc

上述红圈表示是都是MinHash位置。 h(S1)=a, h(S2)=c, h(S3)=b, h(S4)=a.

取集合S1, S2(可以是现实中的那个文档)进行比较:

结论:经随机排列转换之后得到的两个最小哈希值相等的概率, 等于两个集合的Jaccard相似度

推导证明:

在特征矩阵中(稀疏矩阵),S1/S2之间的关系可以分三类:

  1. X: 两列值均为1
  2. Y:一列值为0,一列值为1
  3. Z:两列值为0

关系X的数目有x行,关系Y的数目有y行,关系Z的数据有z行。 大部分为Z类,可忽略。S1和S2相似的概率,通过jaccard相似可计算得:

SIM(S1,S2)=x/(x+y)

h(S1)=h(S2)这个事件的概率的计算又是如何?  对所有行进行随机排列转换,从上到下顺序处理,可知:

情况a.在碰到Y类型的行之前碰到X类型的行的概率:x/(x+y)

[换个方式理解,即:共有x+y行,第一次出现X的概率]

如果第一行属于x类,那么一定有 h(S1)=h(S2)

情况b.首先碰到Y类型的行,值为1的集合(S1/S2其中之一)的那个集合的最小哈希为当前行。值为0的那个集合(另一个)接着扫描下去,如果首先碰到Y类型,那么此时h(S1) ≠h(S2)

因而可知: h(S1)=h(S2)这个事件的概率,就等于x/(x+y), 也就是Jaccard相似度。

四、minhash签名矩阵

上面分析的,只是minhash的一个基本概念。要真正拿来使用,需要进行随机n个排列

对于单个集合S,每个排列最小哈希函数h1,h2,…hn.

S的最小哈希签名向量:  [h1(S), h2(S), ..., hn(S)]  (用列向量表示)

对于一系列集合(多个,假设m个),它的特征矩阵为M。基于M构建一个签名矩阵 (每列对应一个集合的最小哈希签名向量)  nxm阶

————————————————————————————–

【问题1.行号随机排列的实现?】

随机哈希函数实现。要进行n次重排列,即随机选择n个哈希函数h1,h2, … ,hn.  SIG(i,c)为签名矩阵中第i个哈希函数在第c列上的元素。

对行r进行处理:

  • 1.计算 h1(r), h2(r), …, hn(r)
  • 2.对每列c进行如下操作:
  •        2.a) 如果c在第r行为0, 什么都不做
  •        2.b) 如果c在第r行为1,对于每个i=1, 2, …, n,将SIG(i,c)置为原来的(SIG(i,c)和hi(r)中的较小值,即   MIN(SIG(i,c), hi(r))

例如:

 

得到签名相量之后, 我们可以基于集合(列向量)之间Jacard相似度(即认为minhash相等)去判断集合是否相似。

SIM(S1,S4)=1.0

而根据原始上图,可知两者真实的Jaccard相似度为2/3.

注意:签名矩阵之间的一致程度只是真实jaccard相似度的一个估计值。

在大规模数据情况下,估计值和真实值相似(本例规模太小)


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值