基于局部敏感哈希的协同过滤推荐算法之E^2LSH
2015-05-06 10:03
288 查看
一.算法实现
基于p-stable分布,并以‘哈希技术分类’中的分层法为使用方法,就产生了E2LSH算法。E2LSH中的哈希函数定义如下:
其中,v为d维原始数据,a为随机变量,由正态分布产生; w为宽度值,因为a∙v+b得到的是一个实数,如果不加以处理,那么起不到桶的效果,w是E2LSH中最重要的参数,调得过大,数据就被划分到一个桶中去了,过小就起不到局部敏感的效果。b使用均匀分布随机产生,均匀分布的范围在[0,w]。
但是这样,得到的结果是(N1,N2,…,Nk),其中N1,N2,…,Nk在整数域而不是只有0,1两个值,这样的k元组就代表一个桶。但将k元组直接当做桶标号存入哈希表,占用内存且不便于查找,为了方便存储,设计者又将其分层,使用数组+链表的方式。
对每个形式为k元组的桶标号,使用如下h1函数和h2函数计算得到两个值,其中h1的结果是数组中的位置,数组的大小也相当于哈希表的大小,h2的结果值作为k元组的代表,链接到对应数组的h1位置上的链表中。在下面的公式中,r’为[0,prime-1]中依据均匀分布随机产生。
经过如上操作后,查询步骤如下。
对于查询点query, 使用k个哈希函数计算桶标号的k元组; 对k元组计算h1和h2值, 获取哈希表的h1位置的链表, 在链表中查找h2值, 获取h2值位置上存储的样本 Query与上述样本计算精确的相似度,并排序 按照顺序返回结果。
E2LSH方法存在两方面的不足[8]:首先是典型的基于概率模型生成索引编码的结果并不稳定。虽然编码位数增加,但是查询准确率的提高确十分缓慢;其次是需要大量的存储空间,不适合于大规模数据的索引。E2LSH方法的目标是保证查询结果的准确率和查全率,并不关注索引结构需要的存储空间的大小。E2LSH使用多个索引空间以及多次哈希表查询,生成的索引文件的大小是原始数据大小的数十倍甚至数百倍。
部分参考文献:http://dataunion.org/12912.html
二.遗留问题
2.1 hash过后不是还需要由hash吗找到原来的点么,怎么实现?
2.2 球p稳定分布例子
2.3 k元组存入多个哈希表?那查找的结果是什么?每个表中的结果的并?
三.问题扩展
E2LSH可以说是分层法基于p-stable distribution的应用。另一种当然是转换成hashcode,则定义哈希函数如下:其中,a和v都是d维向量,a由正态分布产生。同上,选择k个上述的哈希函数,得到一个k位的hamming码,按照”哈希技术分类”中描述的技术即可使用该算法。
相关文章推荐
- 推荐系统-通过数据挖掘算法协同过滤讨论基于内容和用户的区别
- Mahout系列之推荐算法-基于物品协同过滤实践
- 基于用户协同过滤的推荐系统算法,python 实现
- 基于协同过滤思想的 道具推荐引擎 算法设计
- 推荐算法概述:基于内容的推荐算法、协同过滤推荐算法和基于知识的推荐算法
- Mahout系列之推荐算法-基于用户协同过滤
- 基于协同过滤,NMF和Baseline的推荐算法
- 大数据推荐算法之基于物品协同过滤推荐实例
- 基于协同过滤,NMF和Baseline的推荐算法
- 基于Hbase的用户评分协同过滤推荐算法
- 探索推荐引擎内部的秘密-- 深入推荐引擎相关算法 - 协同过滤
- 推荐引擎算法学习导论-(协同过滤、聚类、分类、模糊和精确k-means算法等)
- 通过mapReduce实现基于项目的协同过滤推荐
- 深入推荐引擎相关算法 - 协同过滤
- 深入相关算法,协同过滤:探索推荐引擎内部的秘密(2)
- 推荐引擎算法学习导论-(协同过滤、聚类、分类、模糊和精确k-means算法等)<转>
- 协同过滤推荐算法的原理及实现
- 探索推荐引擎内部的秘密,第 2 部分: 深入推荐引擎相关算法 - 协同过滤
- 探索推荐引擎内部的秘密,第 2 部分: 深入推荐引擎相关算法 - 协同过滤
- 推荐算法和机器学习系列 - 协同过滤推荐算法和余弦相似性算法