背景:

我遇到一个问题,要计算140万商品的杰卡德相似度。如果直接要直接两两计算的话,这计算量根本算不了,而且也没必要。

分析:

在这些商品中很多商品的相似度并不高,也就是说其中达到相似度阈值的商品只占这些商品组合的一小部分。针对这种情况,首先想到的是按照类别,或者商品品牌进行计算,只计算同类别或者同品牌下的相似品。

但是实际执行效果并不理想,分析原因可能有以下两点。

一、不同类别下的商品数目极不均衡,一些类别比较少的只有十几个,而一些类别下的商品数量极大,可能有十万以上。

二、如果按品牌划分则推荐效果不理想,只能推荐该品牌下的商品,而且同样存在问题一中的情况,即不同品牌的商品数量差别很大。

解决方案:

找到的一种解决方案是使用minhash加一些近似估计的处理。最后达到的效果是在满足一定的准确率的情况下,获得杰卡德距离大于一定阈值的所有商品组合,然后在对这些商品对计算真正的距离。比如我们要求获取杰卡德距离大于0.2的所有商品对,而且准确率不低于99%

先介绍minHash

minhash是局部敏感hash的一种。局部敏感哈希是将原始数据去一个摘要,该摘要还能够表示原始数据之间的相似性,例如相似性大于一定阈值的话,Hash值相等。

minHash要实现这么一种Hash,对于原始集合Set1和Set2的hash,hmin(Set1)=hmin(Set2)的概率p 等于Set1与Set2的杰卡德相似度。

下图是维基百科上的介绍。

接下来介绍算法的两种实现:

一种是使用多个hash函数,这种比较简单。具体过程为,使用K个Hash函数,然后每个Hash函数分别对集合A和集合B计算hmin(SetA) ,hmin(SetB)。然后计算SetA的K个Hash min 和SetB的K个Hash值的交集,假设交集有Y个。则杰卡德相似度的值为Y/K。

第二种是使用一个Hash函数:

使用多个hash函数的计算代价太大(每个都求一次最小值确实费劲)。我们使用一个Hash函数分别求出SetA和SetB的前K小的元素。SetA的前K小的作为A的签名,SetB的前K小的作为B的签名。然后计算集合X:

                                       X = h(k)(h(k)(A) ∪ h(k)(B)) = h(k)(A ∪ B)

根据之前说过的该Hash函数要求的性质X等价于求得A和B的并集的前K小元素的集合。

然后在求一个子集Y,令Y等于:

Y = X ∩ h(k)(A) ∩ h(k)(B)

集合A和集合B的杰卡德距离的估计值是:|Y|/X

应用:

1、MinHash的应用应该是对要计算杰卡德距离的两个集合进行降维,然后通过集合的摘要计算杰卡德相似度。

2、还有一种是通过minhash相等的概率等于杰卡德相似度,来优化大量集合之间的杰卡德相似度的计算。

参考资料:

http://www.cnblogs.com/bourneli/archive/2013/04/04/2999767.html

https://en.wikipedia.org/wiki/MinHash

Minhash 算法 及其应用的更多相关文章

  1. MinHash算法

    MinHash是用于快速检测两个集合的相似性的方法.改方法由Andrei Broder(1997)发明,并最初用于搜索引擎AltaVista中来检测重复的网页的算法.它同样可以用于推荐系统和大规模文档 ...

  2. 文本去重之MinHash算法

    1.概述     跟SimHash一样,MinHash也是LSH的一种,可以用来快速估算两个集合的相似度.MinHash由Andrei Broder提出,最初用于在搜索引擎中检测重复网页.它也可以应用 ...

  3. MinHash算法-复杂度待整理

    1MinHash简介 传统的hash算法只负责将原始内容尽量均匀随机地映射为一个签名值,原理上相当于伪随机数产生算法.传统hash算法产生的两个签名,如果相等,说明原始内容在一定概率下是相等的:如果不 ...

  4. 文本去重之MinHash算法——就是多个hash函数对items计算特征值,然后取最小的计算相似度

    来源:http://my.oschina.net/pathenon/blog/65210 1.概述     跟SimHash一样,MinHash也是LSH的一种,可以用来快速估算两个集合的相似度.Mi ...

  5. 文本相似性计算--MinHash和LSH算法

    给定N个集合,从中找到相似的集合对,如何实现呢?直观的方法是比较任意两个集合.那么可以十分精确的找到每一对相似的集合,但是时间复杂度是O(n2).此外,假如,N个集合中只有少数几对集合相似,绝大多数集 ...

  6. minhash

    minhash是一种基于jaccard index 相似度的算法.属于LSH(Location Sensitive Hash)家族中的一员. jaccard index :有两个集合A={a , b ...

  7. 海量数据集利用Minhash寻找相似的集合【推荐优化】

    MinHash 首先它是一种基于 Jaccard Index 相似度的算法,也是一种 LSH 的降维的方法,应用于大数据集的相似度检索.推荐系统.下边按我的理解介绍下MinHash 问题背景 给出N个 ...

  8. 利用Minhash和LSH寻找相似的集合(转)

    问题背景 给出N个集合,找到相似的集合对,如何实现呢?直观的方法是比较任意两个集合.那么可以十分精确的找到每一对相似的集合,但是时间复杂度是O(n2).当N比较小时,比如K级,此算法可以在接受的时间范 ...

  9. 位姿检索PoseRecognition:LSH算法.p稳定哈希

    位姿检索使用了LSH方法,而不使用PNP方法,是有一定的来由的.主要的工作会转移到特征提取和检索的算法上面来,有得必有失.因此,放弃了解析的方法之后,又放弃了优化的方法,最后陷入了检索的汪洋大海. 0 ...

随机推荐

  1. Java日志记录工具SLF4J介绍

    SLF4J是什么 SLF4J是一个包装类,典型的facade模式的工具,对用户呈现统一的操作方式,兼容各种主流的日志记录框架,典型的有log4j/jdk logging/nop/simple/jaka ...

  2. mfc 对话框程序 托盘实现

    1 在头文件里面定义 消息 #define WM_SHOWTASK WM_USER+10 在主窗口类里面定义 一个变量 两个函数 a 变量 托盘结构体的变量 NOTIFYICONDATA m_nid; ...

  3. mfc中 控件 对话框 添加颜色 背景图片

    1 设置对话框透明 在设置控件颜色中要使用 nCtlColor Contains one of the following values, specifying the type of control ...

  4. Runtime Error! R6025-pure virtual function call 问题怎么解决

    一.故障现象:1.360软件的木马查杀.漏洞修复等组件不能使用,提示runtime error2.暴风影音等很多软件不能正常使用3.设备管理器不能打开,提示“MMC 不能打开文件”4.部分https安 ...

  5. error:No resource found that matches the given name 'Theme.AppCompat.Light'

    一.stsckoverflow http://stackoverflow.com/questions/17870881/cant-find-theme-appcompat-light-for-new- ...

  6. ionic学习笔记—常用命令

    Ionic CLI介绍 Ionic CLI是开发Ionic应用程序过程中使用的主要工具.它就像一个瑞士军刀:它在一个界面下汇集了大量工具. CLI包含许多对Ionic开发至关重要的命令,例如start ...

  7. 使用npm构建前端项目基本流程

    现在各种前端框架, 库文件基本都托管到npm上, 我们平常下载到别人的项目文件, 也基本是用npm 构建的, 不了解点node和npm那是寸步难行. 下面介绍的代码示例不敢说是最佳实践, 但都是我亲自 ...

  8. redis的一些命令

    字符串操作 EX在设置值的时候设置过期时间,ttl查看过期时间 expire能单独设置过期时间 查看所有的key key * 列表操作 lpush从列表左边添加值,rpush从列表右边添加值 lran ...

  9. React:快速上手(5)——掌握Redux(2)

    React:快速上手(5)——掌握Redux(2) 本文部分内容参考阮一峰的Redux教程. React-Redux原理 React-Redux运行机制 我觉得这张图清楚地描述React-Redux的 ...

  10. POJ - 2763 Housewife Wind (树链剖分/ LCA+RMQ+树状数组)

    题意:有一棵树,每条边给定初始权值.一个人从s点出发.支持两种操作:修改一条边的权值:求从当前位置到点u的最短路径. 分析:就是在边可以修改的情况下求树上最短路.如果不带修改的话,用RMQ预处理LCA ...