转:minhash
Minhash算法及其应用
一、引言
MinHash算法属于Locality Sensitive Hashing,用于快速估计两个集合的相似度。最早由Broder Andrei Z. 在1997年提出,最初在AltaVista搜索引擎中用于在搜索结果中检测并消除重复Web页面。如今广泛应用于大数据集的相似检索、推荐系统、聚类分析等中。
Minhash算法
计算两个集合相似度最简单的方法之一是Jaccard距离,其公式如下:

例如集合A = {s1, s2, s3, s4, s5}和B = {s1, s5, s6, s7}的Jaccard距离

当两个集合很大时,计算Jaccard距离会很耗资源,我们从集合A和B的合集中随机抽取一个元素,记为X,那么X既属于A又属于B的概率是
,即Jaccard相似度。
基于这一原理,我们进行如下操作:首先找一个具有很好的均匀性的随机映射hash函数,对各自集合的每一个元素作hash运算得到hash值集合,并在各自hash集合里找出最小hash值,记为
,称为最小hash操作。由于随机的等概率性,那么
相等的概率等于
,即
从另一角度解释:选取一个hash函数进行最小hash操作相当于选取集合A和B合集中的一个元素的选取,由于随机性,这个最小hash值对应的元素属于两个集合的交集的概率即是
,也即这个随机操作时
相等情况的概率。
假如我们使用k个不同的hash函数,其中k是固定的整数,使用这k个函数对这两个集合进行最小hash操作,记y是使得
相等hash函数个数,那么使用y/k可以作为集合A和B的Jaccard相似度的估计。且此估计是无偏估计,而且可以通过增加k来减少估计方差。
但是计算多个hash函数的代价太高,因此另一种实现方法是仅使用单一的哈希函选出其中的多个值来估计。例如对集合A和B使用一个hash函数得到各自m个最小hash值作为各自的特征集合,那么他们特征集合的Jaccard相似度可以作为原两个集合间的Jaccard相似度的估计。
二、应用
在推荐系统中往往需要计算两个物品的相似度,而它是根据用户对物品感兴趣的历史记录来协同计算的,而用户量会远远大于物品的量,如下情况,U1-S3元素为1表示用户U1对物品S3感兴趣,0表示未知或不敢兴趣。
| 用户\物品 | S1 | S2 | S3 | S4 |
|---|---|---|---|---|
| U1 | 1 | 0 | 0 | 1 |
| U2 | 0 | 0 | 1 | 1 |
| U3 | 1 | 1 | 0 | 0 |
| U4 | 0 | 1 | 1 | 0 |
| U5 | 1 | 0 | 1 | 1 |
| U6 | 0 | 0 | 1 | 0 |
| … | … | … | … | … |
当用户很多时我们不可能每算一个物品的minhash就扫一遍整列,那么可以采用模拟随机抽取的方法扫一遍记录来得到。我们选择n个随机hash函数
来顺序构建签名矩阵
,假设
是矩阵的第i个hash函数和第c列,
中所有值最初设为无穷大,然后按照下面的方法来逐行往下处理行:
计算第r行
~~~~
对于所有的列c:如果
是0,不做任何操作;如果
是1,那么对于
那么更新
为当前的
和
的最小值。
这样操作后只要扫一遍记录就可以得到每个物品的n个最小hash值集合,如下图:
| minHash\物品 | S1 | S2 | S3 | S4 | |
|---|---|---|---|---|---|
| h1 | 1 | 2 | 2 | 1 | |
| h2 | 1 | 1 | 3 | 2 | |
| h3 | 1 | 2 | 1 | 1 | |
那么估计的相似度
:,而真实的相似度为
,估计与真实值比较接近。
然而当物品S还是很多时,找出相近的物品或者对物品聚类的时间复杂度还 
我们可以用Locality Sensitive Hashing原理根据minhash值先将相近的物品放入同一个桶,然后缩小聚类范围。具体的讲,如先将12个不同的hash函数计算得到minhash组,然后将其分成了b=4个区间,每个区间r=3个minhash值。那么对于物品A和B在一个区间,3个minhash组都相同的概率是
( S是物品A和B的Jaccard相似度),而至少有一个区间内A和Bminhash组都相同的概率是
也就是说A和B会进入同一个桶的概率函数
它是一个如下S型函数: 

也就是说相似度大于0.7的两物品会分到同一个桶的概率是0.975。
这种方法不仅可以计算近似物品或相似的用户,也可以用户近似图像的搜索,将图像提取局部不变或全局特征后用minhash降维做最邻近搜索,就可以匹配到相同或轻微变化的图片。
在数据挖掘领域中,minhash也可作为关联规则学习,用来辨别频繁共同出现的属性候选对,然后仅计算这些候选对的确切系数值,以确定哪些项目共同出现的频度低于一个给定的严格阈值。
三、参考资料
[1]http://en.wikipedia.org/wiki/MinHash
[2]http://en.wikipedia.org/wiki/Locality_sensitive_hashing
[3]On the resemblance and containment of documents, Compression and Complexity of Sequences: Proceedings, Positano, Amalfitan Coast, Salerno, Italy, June 11-13, 1997, IEEE, pp. 21–29, doi:10.1109/SEQUEN.1997.666900
[4]Mining of Massive Datasets, Anand Rajaraman, Jeffrey David Ullman, Cambridge University Press New York, NY, USA 2011
[5]Google news personalization: scalable online collaborative filtering, Das, Abhinandan S., Mayur Datar, Ashutosh Garg, and Shyam Rajaram, In Proceedings of the 16th international conference on World Wide Web, 271–280. WWW ’07. New York, NY, USA: ACM, 2007.
[6]Near duplicate image detection: min-hash and tf-idf weighting , Philbin, James; Zisserman, Andrew, Proceedings of the British Machine Vision Conference, 3. 2008: 4.
[7]Finding interesting associations without support pruning, Cohen, E.; Datar, M.; Fujiwara, S. Gionis, A.; IEEE Transactions on Knowledge and Data Engineering. 2001, 13 (1): 64–78, doi:10.1109/69.908981.
转自:
https://sq.163yun.com/blog/article/185455192954839040
转:minhash的更多相关文章
- minHash最小哈希原理
minHash最小哈希原理 收藏 初雪之音 发表于 9个月前 阅读 208 收藏 9 点赞 1 评论 0 摘要: 在数据挖掘中,一个最基本的问题就是比较两个集合的相似度.通常通过遍历这两个集合中的所有 ...
- MinHash算法
MinHash是用于快速检测两个集合的相似性的方法.改方法由Andrei Broder(1997)发明,并最初用于搜索引擎AltaVista中来检测重复的网页的算法.它同样可以用于推荐系统和大规模文档 ...
- 文本去重之MinHash算法
1.概述 跟SimHash一样,MinHash也是LSH的一种,可以用来快速估算两个集合的相似度.MinHash由Andrei Broder提出,最初用于在搜索引擎中检测重复网页.它也可以应用 ...
- minhash
minhash是一种基于jaccard index 相似度的算法.属于LSH(Location Sensitive Hash)家族中的一员. jaccard index :有两个集合A={a , b ...
- MinHash算法-复杂度待整理
1MinHash简介 传统的hash算法只负责将原始内容尽量均匀随机地映射为一个签名值,原理上相当于伪随机数产生算法.传统hash算法产生的两个签名,如果相等,说明原始内容在一定概率下是相等的:如果不 ...
- 海量数据集利用Minhash寻找相似的集合【推荐优化】
MinHash 首先它是一种基于 Jaccard Index 相似度的算法,也是一种 LSH 的降维的方法,应用于大数据集的相似度检索.推荐系统.下边按我的理解介绍下MinHash 问题背景 给出N个 ...
- MinHash 原理
最小哈希原理介绍 MinHash是基于Jaccard Index相似度(海量数据不可行)的算法,一种降维的方法A,B 两个集合:A = {s1, s3, s6, s8, s9} B = {s3, s ...
- mahout系列----minhash聚类
Map: Vector featureVector = features.get(); if (featureVector.size() < minVectorSize) { ret ...
- 局部敏感哈希(LSH)之simhash和minhash
minhash 1. 把文档A分词形成分词向量L 2. 使用K个hash函数,然后每个hash将L里面的分词分别进行hash,然后得到K个被hash过的集合 3. 分别得到K个集合中的最小hash,然 ...
- 利用Minhash和LSH寻找相似的集合(转)
问题背景 给出N个集合,找到相似的集合对,如何实现呢?直观的方法是比较任意两个集合.那么可以十分精确的找到每一对相似的集合,但是时间复杂度是O(n2).当N比较小时,比如K级,此算法可以在接受的时间范 ...
随机推荐
- const常量与define宏定义的区别(转)
#define RADIUS 100; const float RADIUS = 100; (1) 编译器处理方式不同 define宏是在预处理阶段展开. const常量是编译运行阶段使用. ( ...
- binary hacks读数笔记(ld 链接讲解 二)
这块将介绍一下ld链接命令的具体使用.ld的作用:ld是GNU binutils工具集中的一个,是众多Linkers(链接器)的一种.完成的功能自然也就是链接器的基本功能:把各种目标文件和库文件链接起 ...
- echarts折线图,数据切换时(最近七天)绘图不合理现象
echarts折线图,当进行数据切换时存在绘制不合理的问题,数据没错,但绘制不对. 两个0之间的连线应该是平滑直线,如图: 正确的显示: 解决: 在myCharts.setOption(option) ...
- UnitTest_墨振文档
目录 一.框架介绍 1 二.四大组件 2 三.ddt数据驱动 3 一.框架介绍 unittest框架是python 自带的一个作为单元测试的测试框架,在最初叫pyUnit,相当与Java语言中的Jun ...
- 如何用Camtasia将喜欢的视频做出复古的感觉
不知道各位可有看老电影的习惯,我个人觉得一些老电影那种别具一格的画面感是非常吸引人的韵味,尽管其色彩不是很鲜艳,但是这种黑白的感觉,对于现在的我们,往往有着不一样的吸引力.于是,我就尝试着用Camta ...
- php8.0正式版新特性和性能优化学习
前言 PHP团队宣布PHP8正式GA(链接).php的发展又开启了新的篇章,PHP8.0.0版本引入了一些重大变更及许多新特性和性能优化机制.火速学习下~ JIT(Just in Time Compi ...
- 关于redis在cluster模式化下的 分布式锁的探索
背景 redis作为一个内存数据库,在分布式的服务的大环境下,占的比重越来越大啦,下面我们和大家一起探讨一下如何使用redis实现一个分布式锁 说明 一个分布式锁至少要满足下面几个条件 ...
- Web 常见漏洞
检测到目标URL存在http host头攻击漏洞 描述:为了方便的获得网站域名,开发人员一般依赖于HTTP Host header.例如,在php里用_SERVER["HTTP_HOST&q ...
- 惠州发布5G任务计划表,将出台智慧灯杆建设计划与技术规范
广东省惠州市于近日发布<惠州市贯彻落实广东省加快5G产业发展行动计划(2019-2022年)工作任务计划表>(以下简称:<5G任务计划表>). <5G任务计划表>明 ...
- dubbo起停之服务注解
开始之前建议先去了解spring的BeanDefinition可以参考下这里:https://www.jianshu.com/p/56e42e82e9a0 当用户使用注解@DubboComponent ...