原载: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之间的关系可以分三类:
- X: 两列值均为1
- Y:一列值为0,一列值为1
- 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相似度的一个估计值。
在大规模数据情况下,估计值和真实值相似(本例规模太小)