最小哈希Min-hashing理解

1. Jaccard

​ 自然文本可以表示成集合,而集合又可以表示成高维的数据,集合除了表示文本,还可以表示图中的顶点。对于集合来说,应用较为广泛的距离或者相似度度量为Jaccard距离或者Jaccard相似度。给定两个集合A和B,两者之间的Jaccard 相似度和距离定义如下:

  • Jaccard相似度:

J a c c a r d ( A , B ) = ∣ A ∩ B ∣ ∣ A ∪ B ∣ Jaccard(A,B)=\frac{|A \cap B|}{|A \cup B|} Jaccard(A,B)=∣A∪B∣∣A∩B∣​

  • Jaccard距离:

D J ( A , B ) = 1 − ∣ A ∩ B ∣ ∣ A ∪ B ∣ DJ(A,B)=1-\frac{|A \cap B|}{|A \cup B|} DJ(A,B)=1−∣A∪B∣∣A∩B∣​

例子:下图中,集合A和集合B的交集大小为3,并集大小为8。因此
J a c c a r d ( A , B ) = 3 8 , D J ( A , B ) = 1 − 3 8 = 5 8 Jaccard(A,B)=\frac{3}{8},DJ(A,B)=1-\frac{3}{8}=\frac{5}{8} Jaccard(A,B)=83​,DJ(A,B)=1−83​=85​

2. Shingling

​ Shingling是自然语言处理领域中用于衡量两个文档相似度的技术。将一篇文档视为一个字符串,文档的k-Shingling定义为其中任意长度为k的子串。这样,每篇文档便可用文档中出现至少一次 k-Shingling 的集合或包来表示。注意,**集合与包的区别在于集合中的元素只能出现一次,而包中的元素可以出现任意次。**在得到某两篇文档的Shingling表示后,可基于该表示采用Jaccard来衡量两篇文档的相似度。


例子:假设一篇文档D的内容为“abcdabcf”。

  • 文档D所有2-Shingling组成的
    S ( D ) = { a b , b c , c d , d a , a b , b c , c f } S(D)=\{ab,bc,cd,da,ab,bc,cf\} S(D)={ab,bc,cd,da,ab,bc,cf}

  • 文档D所有2-Shingling组成的集合
    S ( D ) = { a b , b c , c d , d a , c f } S(D)=\{ab,bc,cd,da,cf\} S(D)={ab,bc,cd,da,cf}

k大小的选择对最终的结果影响很大。例如,当k=1时,由于每篇文档都会包含大量的常用字,因此会得到很多Jaccard相似度很高的文档对;而当k太大,会导致每篇文档只有很少的k-Shingling存在交集,即几乎所有文档之间Jaccard相似度为0。因此,k大小的选择依赖于文档的典型字符的长度,其值应当能保证任意给定的Shingling 出现在任意文档中的概率较低。


3. Min-hashing

​ 给定布尔向量 v随机排列 h ,h(v)为布尔向量v经过随机排列后得到的新向量,mh(v)为新得到的布尔向量h(v)中第一个不为0的行号,函数mh(v)被称之为最小哈希函数。

定义 含义
v 布尔向量
h 随机排列
h(v) v经过随机排列后得到的新向量
mh(v) h(v)中第一个不为0的行号

例子:给定如下四篇文档,求各文档的最小哈希值

文档 内容
d1 “数据 科学 真 是 有趣”
d2 ”数据 科学“
d3 “科学 真 是 有趣”
d4 “数据 科学 是 有趣”

①先求出2-Shingling的特征矩阵,分为以下三个步骤:

  • 步骤1:求出每篇文档分词后的2-Shingling集合,这里分词的策略是按照空格进行划分
文档 2-Shingling集合
d1 {数据 科学、科学 真、真 是、是 有趣}
d2 {数据 科学}
d3 {科学 真, 真 是,是 有趣}
d4 {数据 科学、科学 是、是 有趣}
  • 步骤2:利用哈希函数将2-Shingling集合中的元素映射为其对应的桶号:
    h ( 数据 科学 ) = 0 h ( 科学 真 ) = 1 h ( 真 是 ) = 2 h ( 是 有趣 ) = 3 h ( 科学 是 ) = 4 h(数据\quad科学) =0 \\ h(科学\quad真) = 1 \\ h(真\quad是) = 2 \\ h(是\quad有趣) = 3 \\ h(科学\quad是) =4 \\ h(数据科学)=0h(科学真)=1h(真是)=2h(是有趣)=3h(科学是)=4


    d 1 = { 0 、 1 、 2 、 3 } d 2 = { 0 } d 3 = { 1 、 2 、 3 } d 4 = { 0 、 4 、 3 } d_1=\{0、1、2、3\}\\ d_2=\{0\}\\ d_3=\{1、2、3\}\\ d_4=\{0、4、3\}\\ d1​={0、1、2、3}d2​={0}d3​={1、2、3}d4​={0、4、3}

  • 建立出特征矩阵

桶编号 d1 d2 d3 d4
0 1 1 0 1
1 1 0 1 0
2 1 0 1 0
3 1 0 1 1
4 0 0 0 1

②对特征矩阵进行行重排,得到如下的矩阵

桶编号 d1 d2 d3 d4
4 0 0 0 1
1 1 0 1 0
3 1 0 1 1
2 1 0 1 0
0 1 1 0 1

​ 各文档的最小哈希值为
m h ( d 1 ) = 1 m h ( d 2 ) = 4 m h ( d 3 ) = 1 m h ( d 4 ) = 0 mh(d_1)=1\\ mh(d_2)=4\\ mh(d_3)=1\\ mh(d_4)=0\\ mh(d1​)=1mh(d2​)=4mh(d3​)=1mh(d4​)=0


定理:两个集合S1和S2经过多次随机排列之后得到的两个最小哈希值相等的概率等于这两个集合的Jaccard相似度,即
P r [ m h ( S 1 ) = m h ( S 2 ) ] = J a c c a r d ( S 1 , S 2 ) Pr[mh(S_1)=mh(S_2)]=Jaccard(S_1,S_2) Pr[mh(S1​)=mh(S2​)]=Jaccard(S1​,S2​)

3.1 最小哈希签名

​ 随机选择n个排列变换用于对特征矩阵进行随机重排,对集合S,将会得到n个最小哈希值。集合S的最小哈希签名即为n个最小哈希值构成的列向量
( m h 1 ( S ) , m h 2 ( S ) , . . . , m h n ( S ) ) (mh_1(S), mh_2(S),...,mh_n(S)) (mh1​(S),mh2​(S),...,mhn​(S))
​ 由多个集合的最小哈希签名构成的矩阵即为最小哈希签名矩阵。

​ 对特征矩阵进行随机行排列变换可以通过一个随机的哈希函数来模拟,该哈希函数可将特征矩阵的行号映射到与矩阵行数相同的桶中。具体地,将原来的第r行放在随机排列变换后第h®的位置上。至此,可以随机选取 h 1 , h 2 , . . . , h n h_1,h_2,...,h_n h1​,h2​,...,hn​模拟n次随机行排列变换。


​ 例子:给定两个用于代替行排列变换的哈希函数 h 1 ( x ) = ( x + 1 ) m o d 5 h_1(x)=(x+1)\ mod\ 5 h1​(x)=(x+1) mod 5和 h 2 ( x ) = ( 3 x + 1 ) m o d 5 h_2(x)=(3x+1)\ mod\ 5 h2​(x)=(3x+1) mod 5,求出上文中的特侦矩阵对应的最小哈希签名矩阵。

​ 首先计算两个哈希函数对行号映射的结果

行号 d1 d2 d3 d4 (x+1) mod 5 (3x+1) mod 5
0 1 1 0 1 1 1
1 1 0 1 0 2 4
2 1 0 1 0 3 2
3 1 0 1 1 4 0
4 0 0 0 1 0 3

哈希函数 ( x + 1 ) m o d 5 (x+1)\ mod \ 5 (x+1) mod 5表示第0行经过行重排将被映射到第1行第1行经过行重排将被映射到第2行

​ 根据最小哈希签名的定义可知:
m h 1 ( d 1 ) = 1 , m h 1 ( d 2 ) = 1 , m h 1 ( d 3 ) = 2 , m h 1 ( d 4 ) = 0 mh_1(d_1)=1,mh_1(d_2)=1,mh_1(d_3)=2,mh_1(d_4)=0 mh1​(d1​)=1,mh1​(d2​)=1,mh1​(d3​)=2,mh1​(d4​)=0
​ 和
m h 2 ( d 1 ) = 0 , m h 2 ( d 2 ) = 1 , m h 2 ( d 3 ) = 0 , m h 2 ( d 4 ) = 0 mh_2(d_1)=0,mh_2(d_2)=1,mh_2(d_3)=0,mh_2(d_4)=0 mh2​(d1​)=0,mh2​(d2​)=1,mh2​(d3​)=0,mh2​(d4​)=0
​ 则最小哈希签名矩阵为:

d1 d2 d3 d4
h1 1 1 2 0
h2 0 1 0 0

​ 因此, d 1 d_1 d1​和 d 2 d_2 d2​基于最小哈希签名的相似度 J a c c a r d ( d 1 , d 2 ) = { 1 , 0 } ∩ { 1 , 1 } { 1 , 0 } ∪ { 1 , 1 } = 1 2 Jaccard(d_1,d_2)=\frac{\{1,0\}\cap\{1,1\}}{\{1,0\}\cup\{1,1\}}=\frac{1}{2} Jaccard(d1​,d2​)={1,0}∪{1,1}{1,0}∩{1,1}​=21​(这里写的不太严谨)

3.2 基于最小哈希签名的相似度

​ 基于最小哈希签名矩阵可以估算文档的相似度。如下图所示,左侧彩色竖条为混排后桶号对应的位置(注意:桶编号和文档编号均从1开始编号)。其对应的最小哈希签名矩阵为右上角。右下角的矩阵中第一行为文档间的Jaccard 相似度,第二行为基于最小哈希签名矩阵计算出的文档相似度。虽然用最小哈希签名矩阵可以近似估算两个集合的相似度,但是当哈希函数个数较少时,估算误差可能会比较大。因此,需要选择恰当数量的哈希函数来降低估算误差。

参考书籍:高明 胡卉芪《数据科学与工程算法基础》

最小哈希Min-hashing理解相关推荐

  1. minHash最小哈希

    LSH算法简介 在介绍min-hash算法之前,我们必须先简单介绍一下LSH(局部敏感哈希 Locality Sensitive Hashing)的概念. LSH(局部敏感哈希 Locality Se ...

  2. MinHash (最小哈希)

    原载:http://cool.sinaapp.com 作者:junGle 原文网址:http://1.cool.sinaapp.com/?p=893 minhash是判断文档相似的一种方法.这里结合一 ...

  3. minHash最小哈希原理

    minHash最小哈希原理 收藏 初雪之音 发表于 9个月前 阅读 208 收藏 9 点赞 1 评论 0 摘要: 在数据挖掘中,一个最基本的问题就是比较两个集合的相似度.通常通过遍历这两个集合中的所有 ...

  4. 最小哈希 minhash

    最小哈希 维基百科,自由的百科全书 跳到导航跳到搜索 在计算机科学领域,最小哈希(或最小哈希式独立排列局部性敏感哈希)方法是一种快速判断两个集合是否相似的技术.这种方法是由Andrei Broder  ...

  5. 哈希(Hashing)

    0)引论 哈希(Hashing)是以一种能以常数平均时间进行插入,查找,删除的技术.常数时间一般意义上是指O(1). 是的,Hashing是一种技术,从英文名也可以看出,这是动名词,一般动名词大多表示 ...

  6. python文件查重_文件查重 我使用的是面向局部敏感的最小哈希签名的方法进行文档查重 联合开发网 - pudn.com...

    文件查重 所属分类:其他 开发工具:Python 文件大小:39KB 下载次数:7 上传日期:2017-12-20 16:45:32 上 传 者:lala_ 说明:  我使用的是面向局部敏感的最小哈希 ...

  7. 深入一致性哈希(Consistent Hashing)算法原理

    2019独角兽企业重金招聘Python工程师标准>>> 本文为实现分布式任务调度系统中用到的一些关键技术点分享--Consistent Hashing算法原理和Java实现,以及效果 ...

  8. 一致性哈希(Consistent Hashing)

    在大型web应用中,缓存可算是当今的一个标准开发配置了.在大规模的缓存应用中,应运而生了分布式缓存系统.分布式缓存系统的基本原理,大家也有所耳闻.key-value如何均匀的分散到集群中?说到此,最常 ...

  9. 【哈希】关于哈希表和哈希函数的理解与应用

    0.概述 哈希,或者说散列,在教科书上写的都比较详细,通常包括的内容有散列的方法,散列冲突的解决等.本文暂且不表这些基础知识,更多的重点在于哈希的一些应用和题目,对于哈希表.哈希函数从来没有学习过或者 ...

最新文章

  1. unix更喜欢进程,可是...
  2. tf.where 用法
  3. 简约而不简单|值得收藏的Pandas基本操作指南
  4. exadata磁盘组无法mount恢复---惜分飞
  5. [单选题]$array = array('a','b','c','d'); $array_now = array_splice($array,2); print_r($array_now);...
  6. swift for循环_Swift | 实战一个简单的素数计算器demo
  7. 虚拟磁盘没有可用的合格服务器,VMware提示:没有更多空间可供虚拟磁盘***.vmdk使用 所引发的故障及处理...
  8. redis最基础的入门教程
  9. javaio_java------io基础(一)
  10. 全景视频传输开源项目汇总
  11. window 10自带照片查看软件不能查看下一张图片
  12. 白话前沿IT技术系列—云计算
  13. 变限积分求导公式总结_积分变限函数求导的基本方法
  14. JAVA-【1】配置
  15. IE 调试工具 IETester+DebugBar
  16. 项目质量管理与太极图
  17. java使用Spire.Doc生成的word文件去除水印(头部的警告信息)
  18. 使用iso安装linux系统安装教程,使用光盘iso实现Linux操作系统的自动安装部署
  19. 懈寄生---走出软件作坊:三五个人十来条枪 如何成为开发正规军(十四)[转]...
  20. OpManager邮件服务:使用qq邮箱发送邮件

热门文章

  1. C语言---冒泡排序法
  2. Java系列教程day05——分支语句
  3. python如何自动生成流程图
  4. keep-alive 介绍
  5. Kotlin高仿微信-第23篇-个人信息-二维码名片
  6. 测试用例设计思路参考
  7. day02--java基础编程:变量,数据类型,类型转换,运算规则,运算符,分支结构,循环(随机数),方法,重载,可变参数,递归,数组,冒泡排序
  8. Altium Designer尝试制作PCB尺
  9. 位于磁盘不同磁道的扇区读写速度是否一样
  10. Creating index ‘PRIMARY‘ required more than ‘innodb_online_alter_log_max_size‘ bytes of