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的方法。

相关文章
|
9月前
|
Java 分布式数据库 Docker
使用Docker配置并连接HBase的Java API
本流程概要的解释了如何在Docker上配置并启动HBase服务,并通过Java API进行连接和操作表,不涉及具体的业务逻辑处理和数据模型设计,这些因应用而异需由开发者根据实际需求进行实现。
431 13
|
XML Linux 数据库
openGauss6.0单中心一主两备部署
openGauss6.0单中心一主两备部署
openGauss6.0单中心一主两备部署
|
机器学习/深度学习 人工智能 大数据
看看AI大佬都开了什么公司 | AI大咖说
看看AI大佬都开了什么公司 【10月更文挑战第6天】
1201 1
|
机器学习/深度学习 人工智能 自然语言处理
计算机视觉借助深度学习实现了革命性进步,从图像分类到复杂场景理解,深度学习模型如CNN、RNN重塑了领域边界。
【7月更文挑战第2天】计算机视觉借助深度学习实现了革命性进步,从图像分类到复杂场景理解,深度学习模型如CNN、RNN重塑了领域边界。AlexNet开启新时代,后续模型不断优化,推动对象检测、语义分割、图像生成等领域发展。尽管面临数据隐私、模型解释性等挑战,深度学习已广泛应用于安防、医疗、零售和农业,预示着更智能、高效的未来,同时也强调了技术创新、伦理考量的重要性。
418 1
|
Java
小程序中base64解码/编码
很多人都在为小程序如何实现base64编码/解码困扰,于是我参考前端大佬们对JavaScript中实现base64的文章进行了改写。简单实现了一个。。希望能帮助到小程序开发一线的大家吧、 不多说直接上代码: /** * UTF16和UTF8转换对照表 * U+00000000 – U+000000...
5324 13
|
SQL 前端开发
基于jeecgboot复杂sql查询的列表自定义列实现
基于jeecgboot复杂sql查询的列表自定义列实现
468 0
|
Linux 开发工具
centos 安装ffmpeg
centos 安装ffmpeg
899 0
|
机器学习/深度学习 自然语言处理 监控
预训练、微调和上下文学习
最近语言模型在自然语言理解和生成方面取得了显著进展。这些模型通过预训练、微调和上下文学习的组合来学习。在本文中将深入研究这三种主要方法,了解它们之间的差异,并探讨它们如何有助于语言模型的学习过程。
1221 0
|
区块链 Python
桌面太单调?用Python做个“冰墩墩雪容融”桌面部件(好玩又有趣)
桌面太单调?用Python做个“冰墩墩雪容融”桌面部件(好玩又有趣)
490 0

热门文章

最新文章