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的无偏估计量,否则为有偏估计量
    注:无偏估计就是系统误差为零的估计。
  • 相关阅读:
    DDOS学习笔记(《破坏之王-DDOS攻击与防范深度剖析》)
    gearman学习笔记1
    Sphinx学习笔记2
    docker学习笔记(一)
    Centos7安装配置Xhgui
    MongodDB学习笔记(二)(复制)
    MongoDB学习笔记(一)
    0927 DP 小测 #1
    「NOI 2011」阿狸的打字机 「AC 自动机」「数据结构」
    「POI 2005」SZA-Template 「失配树」「双向链表」「思维」
  • 原文地址:https://www.cnblogs.com/baiting/p/4132066.html
Copyright © 2011-2022 走看看