【机器学习】minHash最小哈希原理及其应用

news2024/11/17 5:32:41

目录

  • 1 前言
  • 2 哈希函数的定义
  • 3 miniHash函数
  • 4 miniHash的例子
  • 5 miniHash数学原理
  • 6 miniHash的应用
  • 7 参考文献

1 前言

  在数据结构中学过哈希概念以及哈希在内存中的应用,在实际的应用问题中哈希技术也应用十分广泛如在推荐系统以及图神经网络技术中,所以在此总结一下哈希的相关概念以及minHash以及其实际应用,其中多有参考别的文献内容,相关参考一并列在参考文献中。

2 哈希函数的定义

  Hash(哈希),又称“散列”。散列(hash)英文原意是“混杂”、“拼凑”、“重新表述”的意思。在某种程度上,散列是与排序相反的一种操作,排序是将集合中的元素按照某种方式比如字典顺序排列在一起,而散列通过计算哈希值,打破元素之间原有的关系,使集合中的元素按照散列函数的分类进行排列。也可以说:Hash函数是一个把大范围的数据映射到小范围的函数。比方说,商店里有三件商品,价格分别为 99 、 199 99、199 99199 299 299 299。我们是否需要开一个 300 300 300 维的数组 H H H 来存储这三件商品,使得 H ( 99 ) = 0 商品 H(99)=0商品 H(99)=0商品 H ( 199 ) = 1 商品 H(199)=1商品 H(199)=1商品 H ( 299 ) = 2 商品 H(299)=2商品 H(299)=2商品 。答案是否定的,由于十位和个位都是 9 9 9,因此我们可以只关注百位 ( 0 , 1 , 2 ) (0,1,2) (0,1,2)。于是我们只需要一个三维的数组 B B B使得 B ( 0 ) = 0 商品 B(0)=0商品 B(0)=0商品 B ( 1 ) = 1 商品 B(1)=1商品 B(1)=1商品 B ( 2 ) = 2 商品 B(2)=2商品 B(2)=2商品。在这个例子中,将三位数 x y z xyz xyz 映射为 x x x就是一个哈希函数。
  下面再举一个内存中应用哈希的例子,内存中通常使用数组或者链表来存储元素,一旦存储的内容数量特别多,需要占用很大的空间,而且在查找某个元素是否存在的过程中,数组和链表都需要挨个循环比较,而通过哈希计算,可以大大减少比较次数。
在这里插入图片描述

举个栗子:
现在有 4 个数 {2,5,9,13},需要查找 13 是否存在。
1.使用数组存储,需要新建个数组 new int[]{2,5,9,13},然后需要写个循环遍历查找:
这样需要遍历 4 次才能找到,时间复杂度为 O(n)。(当然也可以优化用二分查找等吗,但是复杂度仍然大于O(1))

 int[] numbers = new int[]{2,5,9,13};
    for (int i = 0; i < numbers.length; i++) {
        if (numbers[i] == 13){
            System.out.println("find it!");
            return;
        }
    }

2.而假如存储时先使用哈希函数进行计算,这里我随便用个函数:

H[key] = key % 3;
四个数 {2,5,9,13} 对应的哈希值为:

 H[2] = 2 % 3 = 2;
 H[5] = 5 % 3 = 2;
 H[9] = 9 % 3 = 0;
 H[13] = 13 % 3 = 1;

然后把它们存储到对应的位置。
当要查找 13 时,只要先使用哈希函数计算它的位置,然后去那个位置查看是否存在就好了,本例中只需查找一次,时间复杂度为 O(1)。

常见的哈希函数构造方法可以见参考文献【2】。除此之外,从举的例子可以看出,选用哈希函数计算哈希值时,可能不同的 key 会得到相同的结果,一个地址怎么存放多个数据呢?这就是冲突。常用的主要有解决冲突的方法也可见参考文献【2】。

3 miniHash函数

   miniHash原理:MinHash是基于Jaccard Index相似度(海量数据不可行)的算法,一种降维的方法。
   minHash的基本原理:在A∪B这个大的随机域里,选中的元素落在A∩B这个区域的概率,这个概率就等于Jaccard的相似度。

    问题引入:在数据挖掘中,一个最基本的问题就是比较两个集合的相似度通常通过遍历这两个集合中的所有元素,统计这两个集合中相同元素的个数,来表示集合的相似度;这一步也可以看成特征向量间相似度的计算(欧氏距离,余弦相似度)。当这两个集合里的元素数量异常大(特征空间维数很大),同时又有很多个集合需要判断两两间的相似度时,传统方法会变得十分耗时,最小哈希(minHash)可以用来解决该问题。

   这里需要注意一个问题:minHash与传统的hash的区别?在文本相似性度量的问题下,我们来看待这个问题,在文本度量的情况下hash就是将不同长度规则的文本转化成相同长度的字符串,用这些相同长度的字符串来表示原文本。但是传统hash存在一个问题是,相同内容的文本会生成相同的hash,但是相似的文本(可能就是一个字的差别)生成的hash会有很大的不同。但是我们在做文本相似度时,希望对相似的文本生成相似的hash,这样我们只需要计算一个个特定长度的hash值之间相似度,就可以近似得到原文本之间的相似度了,显然传统的hash算法是做不到这一点的。

4 miniHash的例子

假设现在有4个集合,分别为 S 1 , S 2 , S 3 , S 4 S_1, S_2, S_3, S_4 S1,S2,S3,S4;其中, S 1 = { a , d } , S 2 = { c } , S 3 = { b , d , e } , S 4 = { a , c , d } S_1=\{a,d\}, S_2=\{c\}, S3=\{b,d,e\}, S_4=\{a,c,d\} S1={a,d},S2={c},S3={b,d,e},S4={a,c,d},所以全集 U = { a , b , c , d , e } U=\{a,b,c,d,e\} U={a,b,c,d,e}。我们可以构造如下 0 − 1 0-1 01矩阵:
在这里插入图片描述
为了得到各集合的最小哈希值,首先对矩阵进行随机行打乱,则某集合(某一列)的最小哈希值就等于打乱后的这一列第一个值为1的行所在的行号。举一个例子:定义一个最小哈希函数 h h h,用于模拟对矩阵进行随机行打乱,打乱后的 0 − 1 0-1 01矩阵为:
在这里插入图片描述
如图所示, h ( S 1 ) = 2 , h ( S 2 ) = 4 , h ( S 3 ) = 0 , h ( S 4 ) = 2 h(S_1)=2, h(S_2)=4, h(S_3)=0, h(S_4)=2 h(S1)=2,h(S2)=4,h(S3)=0,h(S4)=2
在经过随机行打乱后,两个集合的最小哈希值相等的概率等于这两个集合的Jaccard相似度,证明如下:

现仅考虑集合 S 1 S_1 S1 S 2 S_2 S2,那么这两列所在的行有下面3种类型:
1、 S 1 S_1 S1 S 2 S_2 S2的值都为 1 1 1,记为 X X X
2、只有一个值为 1 1 1,另一个值为 0 0 0,记为 Y Y Y
3、 S 1 S1 S1 S 2 S2 S2的值都为 0 0 0,记为 Z Z Z

S 1 S_1 S1 S 2 S_2 S2交集的元素个数为 x x x,并集的元素个数为 x + y x+y x+y,所以 s i m ( S 1 , S 2 ) = J a c c a r d ( S 1 , S 2 ) = x / ( x + y ) sim(S_1,S_2) = Jaccard(S_1,S_2) = x/(x+y) sim(S1,S2)=Jaccard(S1,S2)=x/(x+y)。接下来计算 h ( S 1 ) = h ( S 2 ) h(S_1)=h(S_2) h(S1)=h(S2)的概率,经过随机行打乱后,从上往下扫描,在碰到 Y Y Y行之前碰到 X X X行的概率为 x / ( x + y ) x/(x+y) x/(x+y),即 h ( S 1 ) = h ( S 2 ) h(S_1)=h(S_2) h(S1)=h(S2)的概率为 x / ( x + y ) x/(x+y) x/(x+y)

5 miniHash数学原理

6 miniHash的应用

   MinHash可以应用在推荐系统中,将上述0-1矩阵的横轴看成商品,竖轴看成用户,有成千上万的用户对有限的商品作出购买记录,可以做商品推荐任务。

7 参考文献

[1]学习数据挖掘3 :MinHash算法
[2]数据结构:哈希 哈希函数 哈希表
[3]文本内容相似度计算方法:minhash
[4]MinHash 原理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/137836.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java多线程之死锁问题,wait和notify

文章目录一. synchronnized 的特性1. 互斥性2. 可重入性二. 死锁问题1. 什么是死锁2. 死锁的四个必要条件3. 常见的死锁场景及解决3.1 不可重入造成的死锁3.2 循环等待的场景哲学家就餐问题(多个线程多把锁)两个线程两把锁三. Object类中提供线程等待的方法1. 常用方法2. wait和…

剑指offer----C语言版----第八天

目录 1. 矩阵中的路径 1.1 题目描述 1.2 基础知识 1.3 思路分析 1.4 小试牛刀 1. 矩阵中的路径 原题链接&#xff1a; 剑指 Offer 12. 矩阵中的路径 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/ju-zhen-zhong-de-lu-jing-lcof/submissions/ 1.1 题…

c++11 标准模板(STL)(std::deque)(七)

定义于头文件 <deque> std::deque 修改器 清除内容 std::deque<T,Allocator>::clear void clear(); (C11 前) void clear() noexcept; (C11 起)从容器擦除所有元素。此调用后 size() 返回零。 非法化任何指代所含元素的引用、指针或迭代器。任何尾后迭代器亦被…

静态主机清单

自定义环境 1.操作环境 需要保准三台主机能够互相通信。设置同一种网络模式&#xff08;nat&#xff09;。 2.配置IP地址 server---192.168.90.134 node1---192.168.90.135 node2---192.168.90.133 3.修改主机名 hostnamectl set-hostname server.exmaple.com hostnamec…

【安全硬件】Chap.3 如何插入一个硬件木马到芯片的组合逻辑电路的漏洞里?不影响正常电路的功能的情况下进行硬件的逻辑加密

【安全硬件】Chap.3 如何插入一个硬件木马到芯片的组合逻辑电路的漏洞里&#xff1f;如何进行硬件的逻辑加密在不影响正常电路的功能的情况下1. 组合逻辑电路的漏洞组合逻辑电路中的硬件木马—举例Fault injection attacks士兵巡逻预案系统解决方法——硬件的逻辑加密&#xff…

坦克大战2.0,3.0,4.0版本

1.坦克大战 0.3 在坦克大战游戏(0.2版)基础上添加如下功能:当玩家按一下j键,就发射一颗子弹. 编写Shot类 package com.yt.tankgame03;/*** 射击子弹*/ public class Shot implements Runnable{int x;//子弹的x坐标int y;//子弹的y坐标int direct;//子弹的方向int speed 2;//子…

Python 做了一个 ChatGPT 机器人,表妹玩了一下午

大家好&#xff0c;我是毕加锁。 毫无疑问&#xff0c;ChatGPT 已经是当下编程圈最火的话题之一&#xff0c;它不仅能够回答各类问题&#xff0c;甚至还能执行代码&#xff01; 或者是变成一只猫 因为它实在是太好玩&#xff0c;我使用Python将ChatGPT改造&#xff0c;可以实现…

【回答问题】ChatGPT上线了!给我推荐20个比较流行的知识蒸馏模型/方法/源码

目录给我推荐20个比较流行的知识蒸馏模型给我推荐10个比较流行的知识蒸馏模型源码给我推荐20个比较流行的深度学习知识蒸馏方法给我推荐20个比较流行的深度学习知识蒸馏方法源码给我推荐20个比较流行的深度学习知识蒸馏实现源码给我推荐20个比较流行的知识蒸馏模型 好的&#…

VSCode配置并连接远程服务器 并设置免密登录

文章目录1 前言PyCharm与VSCode2 VSCode配置远程开发环境3 VSCode配置远程免密登录4 推荐插件参考1 前言 PyCharm与VSCode 最近由于许多深度学习的项目需要在服务器上跑&#xff0c;之前一直使用PyCharm进行开发&#xff0c;使用习惯之后觉得还行&#xff0c;配置稍微有点复杂…

(七)Docker上安装常用软件说明(tomcat,mysql)

目录 一、总体步骤 二、安装tomcat 三、安装mysql&#xff08;简易版&#xff09; 四、安装mysql&#xff08;实战版&#xff09; 一、总体步骤 1、搜索镜像 2、拉取镜像 3、查看镜像 4、启动镜像 5、停止容器 6、移除容器 二、安装tomcat 1、dockerhub官网搜索tom…

福利来了~Python内置函数最全总结,建议收藏

喜迎2023&#xff0c;希望所有人都幸福安康&#xff01;小编在这里给大家放烟花了&#xff0c;希望新的一年疫情嗝屁&#xff0c;霉运全跑&#xff01; 开始正文。 1 abs() 绝对值或复数的模 In [1]: abs(-6) Out[1]: 6 2 all() 接受一个迭代器&#xff0c;如果迭代器的所有…

前端bug每次都比后端多,我总结了5点原因

最近总有朋友跟我吐槽说&#xff0c;每次一汇报&#xff0c;就说前端bug多&#xff0c;前端能力有问题&#xff0c;几乎每次都是前端bug比后端多&#xff0c;还好几次导致项目延期。 我其实听的挺不是滋味的&#xff0c;前端bug比后端多&#xff0c;可能是这么几点原因吧 目录 …

Shiro历史漏洞复现 - Shiro-550

文章目录Shiro简介Shiro历史漏洞Shiro-550Shiro-721漏洞发现Shiro组件识别Shiro漏洞搜索Shiro漏洞检测工具Shiro rememberMe反序列化漏洞&#xff08;Shiro-550&#xff09;漏洞原理影响版本漏洞利用Shiro-721 (未完待续......&#xff09;Shiro简介 Apache Shiro是一种功能强…

LeetCode刷题复盘笔记—一文搞懂动态规划之115. 不同的子序列问题(动态规划系列第三十九篇)

今日主要总结一下动态规划的一道题目&#xff0c;115. 不同的子序列 题目&#xff1a;115. 不同的子序列 Leetcode题目地址 题目描述&#xff1a; 给定一个字符串 s 和一个字符串 t &#xff0c;计算在 s 的子序列中 t 出现的个数。 字符串的一个 子序列 是指&#xff0c;通…

spring boot 日志

目录 什么是日志呢 ? 日志有什么作用呢? 什么是日志呢 ? 日志的作用是什么呢 ? 我们需要学会日志的什么 ? 自定义输出日志 日志持久化 为什么要将日志持久化呢? 如何进行日志的持久化 设置日志级别 日志级别有什么用呢 ? 日志都有哪些级别呢 ? 如何设置日志…

十二、Express接口编写 —— 跨域问题

在前面的HTTP模块内容内容当中讲到这个跨域的问题&#xff0c;跨域就涉及到浏览器的同源策略&#xff0c;跨域只出现在浏览器当中&#xff0c;在浏览器当中去执行脚本的时候会进行一个同源检测&#xff0c;只有是同源的脚本才会被浏览器执行&#xff0c;不同源就是跨域&#xf…

MySQL高级 SQL优化【order bygroup by优化】

目录 1&#xff1a;SQL优化 1.1&#xff1a;order by优化 A. 数据准备 B. 执行排序SQL C. 创建索引 D. 创建索引后&#xff0c;根据age, phone进行升序排序 E. 创建索引后&#xff0c;根据age, phone进行降序排序 F. 根据phone&#xff0c;age进行升序排序&#xff…

STM32MP157驱动开发——Linux 网络设备驱动

STM32MP157驱动开发——Linux 网络设备驱动一、简介STM32MP1 GMAC 接口简介YT8511C 详解二、驱动开发1.网络外设的设备树2.设备驱动三、测试网速测试参考文章&#xff1a;【正点原子】I.MX6U嵌入式Linux驱动开发——Linux 网络驱动 一、简介 网络驱动是 linux 驱动三巨头之一&…

[C语言]三种方法实现n的k次方(递归/调用math库函数/实现pow函数)[含递归图解说明]

目录 1.调用math库函数中的pow函数实现n的k次方 2.创造pow函数实现n的k次方 3.递归实现n的k次方&#xff08;含图解&#xff09; 1.调用math库函数中的pow函数实现n的k次方 pow函数的功能&#xff1a;计算n的k次幂 pow格式&#xff1a;pow(n,k) #include <stdio.h>#in…

@NotEmpty、@NotBlank、@NotNull 区别和使用

这种注解通常使用场景在前端发送过来的数据&#xff0c;先进行校验处理&#xff0c;在进行逻辑判断的&#xff0c;所以在进行校验处理的时候&#xff0c;我们通常会使用这三种注解来进行判断传过来的值 1NotNull 适用于基本数据类型(Integer&#xff0c;Long&#xff0c;Doubl…