zoukankan      html  css  js  c++  java
  • MinHash算法

    MinHash是用于快速检测两个集合的相似性的方法。改方法由Andrei Broder(1997)发明,并最初用于搜索引擎AltaVista中来检测重复的网页的算法。它同样可以用于推荐系统和大规模文档聚类中。

    我们先介绍Jaccard相似度量。对于两个集合A与B,Jaccard相似性系数可以定义为:

    J(A,B)=frac{left|Acap B
ight|}{left|Acup B
ight|}

    容易知道,Jaccard系数是0-1之间的值。当两个集合越接近,那么该值越接近1;反之跟接近0。

    假设h是一个hash function,将A与B的元素映射成一个整数,定义:h_{min}(S)是集合S中具有最小哈希值的元素。假设该哈希值足够好,不会产生碰撞,那么,我们可以得到一个重要的结论:

    仅当Acup B中具有最小哈希值得元素位于Acap B中时,h_{min}(A)=h_{min}(B)

    所以有,Prleft[h_{min}(A)=h_{min}(B)
ight]=J(A,B),即集合A、B经过hash后最小哈希值相等的概率。

    若令r为一个随机变量,当h_{min}(A)=h_{min}(B)时取1,否则取0,那么r就是J(A,B)的一个无偏估计。

    有了上面的重要结论,我们可以根据minhash来计算两个集合的相似度了。

    方法1:使用多个hash函数

    取k个hash函数,对于每个hash函数,计算h_{min}(A)h_{min}(B)。用y表示h_{min}(A)=h_{min}(B)的次数,那么可以用y/k来估计J(A,B)

    方法2:使用单一的hash函数

    上面讲到的方法1是比较耗时的,因为要计算集合中每个元素的k个哈希函数的值,计算复杂度比较高。为了达到一定的准确性,k通常取400或800。

    为了减少计算量,我们定义h_{(k)}(S)表示集合S中拥有最小hash值的k个元素组成的子集。我们可以把h_{(k)}(S)当成集合S的一个签名。我们可以用两个集合的签名的相似度来估计这两个集合的相似度。

    那么

    X=h_{(k)}left(Acup B)=h_{(k)}(h_{(k)}(A)cup h_{(k)}(B)
ight)

    是集合Acup B的一个随机抽样。

    Y=Xcap h_{(k)}(A)cap h_{(k)}(B)

    是X和Acap B的交集。

    因此,|Y|/kJ(A,B)的一个无偏估计。

    根据标准切尔诺夫界限,对与非替换的抽样,期望的误差

    注:无偏估计:

    设A'=g(X1,X2,...,Xn)是未知参数A的一个点估计量,若A'满足
    E(A')= A
    则称A'为A的无偏估计量,否则为有偏估计量
    注:无偏估计就是系统误差为零的估计。
  • 相关阅读:
    hdu 4027 Can you answer these queries?
    hdu 4041 Eliminate Witches!
    hdu 4036 Rolling Hongshu
    pku 2828 Buy Tickets
    hdu 4016 Magic Bitwise And Operation
    pku2886 Who Gets the Most Candies?(线段树+反素数打表)
    hdu 4039 The Social Network
    hdu 4023 Game
    苹果官方指南:Cocoa框架(2)(非原创)
    cocos2d 中 CCNode and CCAction
  • 原文地址:https://www.cnblogs.com/baiting/p/4132066.html
Copyright © 2011-2022 走看看