MinHash原理与应用

简介: MinHash首先它是一种基于 Jaccard Index 相似度的算法,也是一种LSH的降维的方法,应用于大数据集的相似度检索、推荐系统。下边按我的理解介绍下MinHash。 举例A,B 两个集合: A = {s1, s3, s6, s8, s9} B = {s3, s4, s7, s8,

MinHash首先它是一种基于 Jaccard Index 相似度的算法,也是一种LSH的降维的方法,应用于大数据集的相似度检索、推荐系统。下边按我的理解介绍下MinHash。

举例A,B 两个集合:

A = {s1, s3, s6, s8, s9}

B = {s3, s4, s7, s8, s10}

根据Jaccard Index公式,A,B的相似度 S(A,B) = |AB|/|A∪B| = 2/8 = 0.25

当然直接计算两个集合的交集与并集,是很耗计算资源的,特别是在海量数据场景下不可行。

假如,我们随机从两个集合中各挑选一个元素s(A)、s(B),刚好这两个无素相同的概率是多少呢?

从图上看,这个概率其实等同于,在A∪B这个大的随机域里,选中的元素落在A∩B这个区域的概率,这个概率就等于Jaccard的相似度!这就是MinHash的基本原理。

基于这一原理,我们找一个随机的哈希函数h,对集合的每一个元素作哈希运算,比如集合A,可以算出5个hash值,因为是随机的,这5个hash值里值最小的那个元素,对于A集合中所有元素概率都是均等的。同样方法从B中取最小hash值,2个minhash相等的概率就是集合的相似度了。

我们只需要找到N个哈希函数,对集合生成一组minhash,算两个集合的相似度,也就是这2组minhash中,交集/并集了。

这个计算相对容易了,因为每个集合的元素数变成了常数N,也就是说,MinHash其实是一种降维技术

在Mahout中用MinHash作聚类,则是将每个minhash相同的向量聚集为一个簇,哈希函数个数为10的情况下,有一个hash相同就表示至少有20%的相似度了。

你可能注意到,这个相似度其实没有说元素的权重,另一个问题是哈希函数个数,理论上次数越多,会越准确,但是计算复杂度也越高,实际应用需要找一个平衡点。

我在一个推荐人的场景——将几十万优质用户按相似度推荐给几千万的普通用户,就是先用MinHash筛选一次,为每个普通用户推荐一个按MinHash相同个数作排序的、至少跟用户交集的优质用户备选集,再计算用户跟备选集的余弦相似度,找出最相似的TOPN作为推荐。这种方法虽然不是最优解(计算量仍然很大),但是在一个可接受的时间范围内,效果跟两两计算余弦相似取TOPN相比比较接近(通过取样测试,取用户权重最重的TOPN个属性作MinHash计算,这样的结果往在做TOPN的推荐容易接近于基于COS的最优解)。另外因为涉及到两个量级差异比较大的集合的推荐,简单用聚类推荐效果很难达到使用MinHash的方法。

相关文章
|
NoSQL MongoDB
MongoDB compact 命令详解
为什么需要 compact 一图胜千言 remove 与 drop 的区别 MongoDB 里删除一个集合里所有文档,有两种方式 db.collection.remove({}, {multi: true}),逐个文档从 btree 里删除,最后所有文档被删除,但文件物理空间不会被回收 db.
|
6月前
|
Java 分布式数据库 Docker
使用Docker配置并连接HBase的Java API
本流程概要的解释了如何在Docker上配置并启动HBase服务,并通过Java API进行连接和操作表,不涉及具体的业务逻辑处理和数据模型设计,这些因应用而异需由开发者根据实际需求进行实现。
315 13
|
存储 自然语言处理 算法
阿里云百炼之RAG算法能力分享会来喽|速来围观~
阿里云百炼是基于通义大模型、行业大模型以及三方大模型的一站式大模型开发平台。提供完整的模型训练工具和全链路开发套件,预置丰富的应用插件,提供便捷的集成方式,结合企业专属数据和API,帮企业高效完成大模型应用构建。RAG检索增强应用是在通义千问-Max大模型基础之上,专项增强「基于知识检索的大模型生成能力」,支持基于结构化/非结构化内容的文字生成场景。
1126 5
|
Docker Python Windows
Docker selenium 自动化 - 使用python操作docker,python运行、启用、停用和查询容器实例演示
Docker selenium 自动化 - 使用python操作docker,python运行、启用、停用和查询容器实例演示
1569 0
Docker selenium 自动化 - 使用python操作docker,python运行、启用、停用和查询容器实例演示
|
SQL 前端开发
基于jeecgboot复杂sql查询的列表自定义列实现
基于jeecgboot复杂sql查询的列表自定义列实现
364 0
|
机器学习/深度学习 监控 算法
OpenAI Gym 高级教程——深度强化学习库的高级用法
OpenAI Gym 高级教程——深度强化学习库的高级用法
1397 0
|
网络协议 C++ Docker
Docker pull拉取镜像报错“Error response from daemon: Get "https://registry-1.docker.io/v2”解决办法
Docker pull拉取镜像报错“Error response from daemon: Get "https://registry-1.docker.io/v2”解决办法
66202 2
|
区块链 Python
桌面太单调?用Python做个“冰墩墩雪容融”桌面部件(好玩又有趣)
桌面太单调?用Python做个“冰墩墩雪容融”桌面部件(好玩又有趣)
424 0