一、什么是近似最近邻查找
NN与ANN NN,Nearest Neighbor Search,最近邻查找问题
KNN,K-Nearest Neighbor,k最近邻,查找离目标数据最近的前k个数据项
ANN,Approximate Nearest Neighbor,近似最近邻检索,在牺牲可接受范围内的精度的情况下提高检索效率
最近邻检索是线性复杂度的,当处理大规模数据时可以采用ANN方法
LSH,局部敏感哈希是ANN的一种
二、什么是Hash
主要的索引技术:
基于树的索引技术(二叉树,B-Tree,B+Tree)
基于哈希的索引技术
基于词的倒排索引
海量数据的检索方式,Hash是重要的索引技术
三、LSH算法
针对海量 and 高维数据如何进行查找:
如果数据是低维 and 小数据 => 通过线性的方式查找
数据不仅海量,而且高维 => 需要降维,采用索引方式查找 LSH,Locality-Sensitive Hashing,局部敏感哈希
需要查找与某个数据1个或多个相似的数据
最近邻查找方法(ANN,Approximate Nearest Neighbor)
LSH:
通过Hash Function,每个Bucket会落入一些原始数据,属于同一个桶内的数据有很大可能是相邻的(也存在不相邻的数据被hash到了同一个桶内)
将原始数据集合分成了多个子集合,每个子集合中的数据大概率是相邻的,而且子集合中的元素个数较少。
方便进行近邻查找 => 在一个很小的集合里查找相邻元素
四、 MinHash算法
文档相似度计算:
k-shingle,也称为k-gram,文档中任意长度为k的字符串。将每篇文档可以表示成文档中出现一次或者多次的k-shingle的集合
比如document="abcdabd",当2-shingle组成的集合为 {ab,bc,cd,da,bd}
如果两个文档相似,那么他们会有很多的shingles也是相同的
文本越长,K取值越大。K的经验值参考,短文本K=5,长文本K=10
五、MinHash+LSH:
除了要解决Ci和Cj两两之间相似度的计算问题,
当数据量大的时候,两两之间相似度计算次数为 当数据量N很大(>100万),计算量非常大 => 将可能相似的用户以较大概率分到同一个桶内,这样每一个用户的“相似用户候选集”就会少很多,大大降低计算复杂度
LSH是相似度的近似求解方式 在MinHash基础上,将Signature向量分成多段(band)