最小哈希 minhash
最小哈希
在计算机科学领域,最小哈希(或最小哈希式独立排列局部性敏感哈希)方法是一种快速判断两个集合是否相似的技术。这种方法是由Andrei Broder (1997),[1]发明的,最初在AltaVista搜索引擎中用于在搜索结果中检测并消除重复Web页面。[2]
它同样也应用于大规模聚类问题,比如通过文档间包含的词语相似性进行聚类。[1]
雅可比相似度与最小哈希值
- {\displaystyle J(A,B)={{|A\cap B|} \over {|A\cup B|}}.}
它是一个0到1之间的数值上,当其为0时表示两个集合不相交,当其为1时表示两个集合相等,其他的情况则在0和1之间。它广泛地用于两集合间相似性的判断:当雅可比系数趋向于1时,两个集合更相似;反之,当雅可比系数趋向于0时,两个集合更不相似。
假定h是一个将A和B中的元素映射到一些不相交整数的哈希函数,而且针对给定的S,定义hmin(S)为S集合中具有最小h(x)函数值的元素x。这样,只有当最小哈希值的并集A ∪ B依赖于交集A ∩ B时,有hmin(A) = hmin(B)。 因此,
- Pr[hmin(A) = hmin(B)] = J(A,B).
另一方面来说,如果r是一个当hmin(A) = hmin(B)时值为1,其它情况下值为0的随机变量,那么r可认为是J(A,B)的无偏估计。尽管此时方差过高,单独使用时没什么用处。最小哈希方法的思想是通过平均用同一方式构造的许多随机变量,从而减少方差。
算法
多哈希函数的变种
最简单的最小哈希方法是使用k个不同的哈希函数,其中k是固定的整数参数,使用这k个函数所对应的k个hmin(S)值来描述每个集合S。 使用这种最简单的版本来判断J(A,B),假定y是使得hmin(A) = hmin(B)的哈希函数个数,使用y/k作为估计。则此估计是k个不同的0-1随机变量的平均值,其中每个随机变量当hmin(A) = hmin(B)值为1,反之为0,并且是J(A,B)的无偏估计。因此,该平均值同样也是一个无偏估计,而且通过0-1随机变量之和的标准Chernoff上界可得知,其期望误差是O(1/√k)。所以,针对任意给定的常数ε > 0,存在另一常数k = O(1/ε2),其估计的期望误差不超过ε。例如,使用400个哈希函数值来估计J(A,B),其期望误差将小于或等于.05。
单一哈希函数的变种
计算多个哈希函数的代价是相当昂贵的,因此有关最小哈希方法的另一种实现方法是仅使用单一的哈希函数来避免这个问题。对于每个集合,使用这个单一的哈希函数选出其中的多个值,而不是每个哈希函数选择一个值。假定h是一个哈希函数,k是一个固定整数。如果S是h域上k或更多元素的集合,则定义h(k)(S)为S中具有最小h值的k个元素所组成的子集。该子集h(k)(S)可用作集合S的一个签名,任意两个集合间的相似度可通过比较它们的签名来计算。
特别地,假定A and B为任意两个集合,X = h(k)(h(k)(A) ∪ h(k)(B)) = h(k)(A ∪ B)是A ∪ B的k个元素的集合,如果h是随机变量并且k个元素的任意子集等可能地被选择。也就是说,X是A ∪ B的简单随机样本。Y = X ∩ h(k)(A) ∩ h(k)(B)是集合X中属于A ∩ B交集的元素。因此,|Y|/k是J(A,B)的无偏估计。单一哈希函数的估计与多个哈希函数产生的估计的不同在于Y总是有k个元素,而多个哈希函数由于两个不同的哈希函数可能会产生相同的最小值,因此可能会产生更少的样本元素。然而,当k相对集合大小来说很小时,该区别可忽略不计。
通过不重复取样的标准Chernoff上界,该估计的期望误差为O(1/√k),其性能与多个哈希函数方法相匹配。
耗时分析
|Y|/k估计通过给定集合的两个签名能够在O(k)能够计算出来,因此,当ε and k为常数时,从签名中计算相似度估计的时间也为常数,这样当众多两两相似度需要计算时,该方法在运行时间上与每个集合中元素的完全比较相比,能够有实质性的优化。
最小哈希式独立排列
为了实现上述的最小哈希方法,哈希函数h需要定义n元素上的一个随机排列,这里的n是指待比较的所有集合并集中不相交元素的总数。 但是由于存在n!个不同的排列,仅仅指定一个真正随机的排列就需要Ω(n log n)位,即使n一般时,这个数值也很大。基于这样的事实,与全局哈希相类似的理论,有大量的研究工作寻找“最小哈希式独立的”一簇排列,意指针对域的任意子集,任何元素都与其最小值是等可能的。已经证明,最小哈希式独立的排列簇至少必须包含:{\displaystyle lcm(1,2,...,n)\geq e^{n-o(n)}}个不同的排列,因此它需要Ω(n)位来指定一个排列,这个数值仍然很大。[2]
由于实践上不可行,引入了最小哈希式独立的两个变型概念:严格最小哈希式独立排列簇和近似最小哈希式独立排列簇。 严格的最小哈希式独立是指最小哈希式独立属性被限制在集合基数至多为k的一些集合中。[4] 近似最小哈希式独立最多有一个固定的概率ε变化为完全独立。[5]
应用
最小哈希的最初应用包括在Web文档中聚类并消除近似重复,这通过在那些文档中出现的词语集合来描述。[1][2] 相似的技术也应用于其他类型数据的聚类和近似重复消除,如图片:在图片数据中,一张图片可以通过分割用很多更小的子图片集合或更多复杂图片特征的描述集合来表示。[6]
Schleimer, Wilkerson & Aiken(2003)使用最小哈希技术作为数字文档剽窃检测方法的一部分,他们的方法将文档表示成给定长度的子串集合,将文档划分成更大固定长度的窗口,然后使用子串的最小哈希值作为每个窗口的描述值。如果文本的拷贝部分比两倍窗口尺寸还要长,则该描述值将肯定匹配保存在数据库中众多描述值中的一个,这样那个窗口就可以用来检查有多少内容是拷贝的。[7]
在数据挖掘领域,Cohen et al.(2001)使用最小哈希技术作为关联规则学习的工具。给定一个数据库,其中每一项都有多个属性(可看作是每行为一个数据库项, 每列为一个属性的0-1矩阵),他们将最小哈希的近似度方法应用于Jaccard系数,用来辨别频繁共同出现的属性候选对,然后仅计算这些候选对的确切系数值,以确定哪些项目共同出现的频度低于一个给定的严格阈值。[8]
相关主题
最小哈希方法可看作是局部性敏感哈希的一个实例。局部性敏感哈希是使用哈希将大集合的数据对象映射到更小的哈希值的技术集合,通过这样的方法当两个对象距离相近时,它们的哈希值也可以相同。在最小哈希方法实例中,一个集合的签名可看作是它的哈希值。其它局部性敏感哈希技术还有针对集合间的海明距离,以及向量间的余弦距离等。另外,局部性敏感哈希还在最近邻搜索算法有着重要的应用。[9]
最小哈希 minhash的更多相关文章
- minHash最小哈希原理
minHash最小哈希原理 收藏 初雪之音 发表于 9个月前 阅读 208 收藏 9 点赞 1 评论 0 摘要: 在数据挖掘中,一个最基本的问题就是比较两个集合的相似度.通常通过遍历这两个集合中的所有 ...
- 海量数据挖掘MMDS week2: 局部敏感哈希Locality-Sensitive Hashing, LSH
http://blog.csdn.net/pipisorry/article/details/48858661 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...
- MinHash算法
MinHash是用于快速检测两个集合的相似性的方法.改方法由Andrei Broder(1997)发明,并最初用于搜索引擎AltaVista中来检测重复的网页的算法.它同样可以用于推荐系统和大规模文档 ...
- 文本去重之MinHash算法
1.概述 跟SimHash一样,MinHash也是LSH的一种,可以用来快速估算两个集合的相似度.MinHash由Andrei Broder提出,最初用于在搜索引擎中检测重复网页.它也可以应用 ...
- MinHash算法-复杂度待整理
1MinHash简介 传统的hash算法只负责将原始内容尽量均匀随机地映射为一个签名值,原理上相当于伪随机数产生算法.传统hash算法产生的两个签名,如果相等,说明原始内容在一定概率下是相等的:如果不 ...
- 海量数据集利用Minhash寻找相似的集合【推荐优化】
MinHash 首先它是一种基于 Jaccard Index 相似度的算法,也是一种 LSH 的降维的方法,应用于大数据集的相似度检索.推荐系统.下边按我的理解介绍下MinHash 问题背景 给出N个 ...
- 海量数据挖掘MMDS week7: 局部敏感哈希LSH(进阶)
http://blog.csdn.net/pipisorry/article/details/49686913 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...
- MinHash 原理
最小哈希原理介绍 MinHash是基于Jaccard Index相似度(海量数据不可行)的算法,一种降维的方法A,B 两个集合:A = {s1, s3, s6, s8, s9} B = {s3, s ...
- 海量文件查重SimHash和Minhash
SimHash 事实上,传统比较两个文本相似性的方法,大多是将文本分词之后,转化为特征向量距离的度量,比如常见的欧氏距离.海明距离或者余弦角度等等.两两比较固然能很好地适应,但这种方法的一个最大的缺点 ...
随机推荐
- [LeetCode] 190. Reverse Bits 翻转二进制位
Reverse bits of a given 32 bits unsigned integer. For example, given input 43261596 (represented in ...
- Python和Java、PHP、C、C#、C++等其他语言的对比?
1111 1.C语言,它既有高级语言的特点,又具有汇编语言的特点,它是结构式语言.C语言应用指针:可以直接进行靠近硬件的操作,但是C的指针操作不做保护,也给它带来了很多不安全的因素.C++在这方面做了 ...
- js玩命加载……
在请求数据加载的过程中,经常需要显示请求等待,写了一个简单的请求等待—- html代码如下 <!--页面载入显示--> <div id="dataLoad" st ...
- int main(int argc, char *argv[])解释
int main(int argc, char *argv[]) 详解: #include <stdio.h> int main(int argc, char *argv[]) { int ...
- 38 多线程(十)——volatile 数据同步
在多线程并发的情况下,同一个变量被多个线程调用,那修改的数据就不会每分每秒保持一致.例如,对于某个变量a,线程1对它进行一套操作,线程2又对它进行另一套操作,但如果cpu太忙了,太忙了,假设cpu都用 ...
- day20——规范化目录
day20 为什么要有规范化目录 可读性高: 不熟悉这个项目的代码的人,一眼就能看懂目录结构,知道程序启动脚本是哪个,测试目录在哪儿,配置文件在哪儿等等.从而非常快速的了解这个项目. 可维护性高: 定 ...
- 01-打印Hello World、变量
一.打印Hello World 下面就是我们写的打印hello world程序 在go语言中://代表单行注释,/**/代表多行注释 //单行注释 /* 多行注释 多行注释 */ package ma ...
- Redis之RDB和AOF持久化介绍
什么是数据库状态 redis是一个键值对的数据库服务器,服务器中通常包含中任意个非空的数据库,而每个数据库又可以包含任意个键值对,为了方便起见,我们将服务器中的非空数据库以及他们的键值对统称为数据库状 ...
- 14.1 Scroll说明和注意事项
使用scroll滚动搜索: 比如全文搜索10万条数据,不能一次全搜出来返回,太耗时了.通常是一批一批的获取结果,滚动搜索 1. 第一次搜索时,会生成这批数据的快照,下次再搜的时候,基于此快照进 ...
- .net 调用存储过程
语言:C# 一.调用带输入参数的存储过程 首先自然是在查询分析器里创建一个存储过程喽~~ 如下所示: create proc proc_1 @uid int, @pwd varchar(255) ...