- 应用:从海量高维数据中查询与某个数据最相似的一个数据或数据集(用于人脸检索)
- 基本思想:基于原始数据空间中相邻的数据经过同一个映射变换之后,处于相邻区域的概率仍然较大的理念;人为的选取一些具有上述性质的函数来作为哈希函数,使得相邻的数据映射后处在哈希表的同一个位置,这样就可以轻松的找到与该数据相似的数据集了。即,通过选取的哈希函数的映射变换能够将原始的数据集划分为若干较小的子集,且每个子集中的元素个数较小且相邻。
- 局部敏感哈希函数的服从如下两个条件:
- 如果 d(x,y) ≤ d1, 则 h(x) = h(y) 的概率至少为 p1
- 如果 d(x,y) ≥ d2, 则 h(x) = h(y) 的概率至多为 p2
- 这两个条件正是对之前提到局部敏感哈希函数的性质的约束,意义也比较容易理解
- 局部敏感哈希算法的大致运行过程
- 构建索引集
- 因为单个哈希哈数的区分能力不强(即p1与p2的差距不足够打),所以一般构造L个局部敏感哈希函数,每个局部敏感哈希函数含有K个不同的符合约束条件的哈希函数(相当于做物理实验为了减小误差,进行多次重复实验)
- 具体实现过程:一个高维的数据点X经过一个局部敏感哈希函数 g i g_i gi 映射为 K 维的哈希码(且 K 要远小于 X 本身的维数),哈希码就是 g i g_i gi 的每一个哈希函数 h i h_i hi 将 X 映射到的那个数值组成的坐标序列,而具有相同的哈希码的数据点分布在相同的哈希桶内(即将两个数据发生哈希冲突视为两者相似同类)
g i ( X ) = ( h 1 ( X ) , h 2 ( X ) , . . . . . , h k ( X ) ) g_i(X) = (h_1(X), h_2(X), ..... , h_k(X)) gi(X)=(h1(X),h2(X),.....,hk(X)) - 通过测试集的测试来决定 L 与 K 的具体数目,来达到良好的查询效果 (即训练学习)
- 实际查询过程
- 将查询数据经过局部敏感哈希函数映射得到相应的哈希码
- 依据哈希码,取出相应桶中的数据
- 线性检索数据中与查询数据最接近的一个或多个数据,返回结果
- 构建索引集
- 常用局部敏感哈希哈数族
- 常用的相似度计算方法介绍
- 欧式距离(即常用的坐标差平方和开根号) d = ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 d = \sqrt{(x_1-x_2)^2 +(y_1 - y_2)^2} d=(x1−x2)2+(y1−y2)2
- Jaccard 距离:其值为 1 - Jaccard 相似度,而 Jaccard 相似度则是被用于比较两个集合之间的相似度, J a c c a r d = ∣ A ∩ B ∣ ∣ A ∪ B ∣ Jaccard = \frac{|A\cap B|}{|A\cup B|} Jaccard=∣A∪B∣∣A∩B∣
- 余弦距离:在欧式空间与离散型欧式空间中有效,视一个向量和它乘以一个常数后的向量为同一个向量,则不同的向量之间的余弦距离被定义为两个向量之间的夹角中较小的那一个(即为锐角的那一个)
- 汉明距离:给定一个向量空间,汉明距离被定义为两个向量之间它们坐标不同的数目,汉明距离常用于二进制向量空间中(即坐标由 0,1 构成)
- 曼哈顿距离:即 L 1 L_1 L
- 常用的相似度计算方法介绍