位置敏感哈希Locality-Sensitive Hashing (LSH)

图像检索其基本定义为给定的一个包含个图像数据集,每个图像可以用一个维的特征向量来描述,因此整个图像数据集就映射为维空间的个点,在此维空间中用一个相似度度量函数来测量两个图像点之间的距离,对于任意给定的查询点,需要设计一个数据结构,来快速的返回距离最近(Nearest Neighbor)的图像点(或者Ranking的多个点)。

    当较小时(10-20),可采用如的结构,但当较大时(一个Discriminative的图像描述向量通常成百上千甚至万维),其查询时间将随指数级增长,这就是通常所说的维数灾难"the curse of dimensionality", 同时较大时,其所需的存储空间也变的intolerable。因此降维和Approximation NN算法通常会用到当前的检索系统中,ANN搜索就是对于给定的查询点,若数据集中存在点 距其小于距离 ,允许系统返回点 ,where,则称为搜索。

      

      当前图像检索要求快、准、同时可容易的扩展至大规模数据web-scale:

Fast:hashing structure,small code, ANN; 

Accurate: discriminative feature fingerprint; 

Scalable: very little memroy.

    由此可见,紧凑的fingerprint和有效的hash结构对整个检索系统至关重要,目前的图像检索系统中,常采用Hashing技术将高维的图像特征编码为低维的特征,在映射后的 空间中采用一定的距离度量进行ApproximationNearest Neighbors (ANN)搜索:

定义Hash函数集: 是原始的  维特征空间, 是经hash函数集 散列后的  维空间,根据哈希函数设计的不同,可将Hashing分为data-independent和data-dependent两大类:

(1) data-independent hashing包括:Locality-Sensitive Hashing (LSH), 经Hash函数映射后,仍保留原始空间的距离相似度;

(2) data-dependent hashing包括:spectral hashing, semi-supervised hashing, Restricted Boltzmann Machine (RBM), Boosting SSC等,引入机器学习算法,基于数据分布设计Hash函数。

 

在此主要介绍Locality-Sensitive Hashing,主要是解读相关原始Paper

===============================================LSH====================================================

      位置敏感哈希Locality-Sensitive Hashing (LSH),其基本的思想就是通过哈希函数将输入的高维特征矢量散列至低维特征空间,并满足在原始空间中距离较近的点经过散列之后在低维空间依然距离较近,距离较近的点散列后碰撞的概率要大于距离较远的点碰撞的概率。用数学语言描述即为:

 为距离阈值,是距离函数,如欧式距离:

,则的概率至少为();

 ,则的概率至多为(),

时,称为 -sensitive, 也称为(R, c)-NN.


---------------------------------------------------

常用的几种LSH构建方法:

1. Bit sampling for Hamming distance

      最简单的Hash函数,仅适用于原始特征空间是Binary的Hamming空间,即原始的特征向量每一维的取值为{0,1}的特征串,其Hash函数的基本思想就是随机选取  维特征向量中的某一维:

2. Random projection
   The random projection method of LSH is designed to approximate thecosine distancebetween vectors.

      Hash函数设计的基本思想就是定义一个随机超平面可看做分别是超平面的斜率和截距(参照二维平面直线的定义),超平面将整个原始的特征空间划分为两部分(平面的两侧),用{0, 1}表示,则Hash函数的映射过程为:


 是 维的法向单位向量,即,每一个不同的即定义一个超平面(可令=0).

可证明两个特征vector经Hash函数散列后碰撞的概率和其在原始空间的余弦距离成正比,即是vector 的夹角,和余弦距离成正比.

3. Stable distributions[2]

  Hash函数设计的基本思想也是定义一个随机超平面,不同于2.之处在于Hash函数将 维的特征矢量散列到 之间的一个整数而不是{0, 1}二值码,其Hash过程:

 

 

   维向量,每一维都是一个随机变量,各维之间独立同分布,服从一个Stable Distribution,  是一个间均匀分布的随机变量。

 稳态分布的定义:

 A distribution  over is called  p-stable, ifthere exists   such that for any real numbers and i.i.d. variables with distribution , the random variable   has the same distribution as the variable  where  is a random variable with distribution.

简而言之就是若随机变量线性组合的分布与随机变量乘一个  归一化系数服从同一分布,则此分布即为稳态分布,对于 ,都存在一个稳态分布, 两个常用的Stable Distribution:

  • Cauchy distribution: 1-stable即  稳态,其概率密度函数为:

                                        

  • Gaussian distribution: 2-stable  稳态,概率密度函数为:

                                       


由稳态分布的性质,我们可以看出基于稳态分布Hash函数设计的思想:

 维的向量映射到一条直线,将此直线划分为 大小等间隔的段,则哈希函数 将向量映射到直线的某一段;
 中每一维 都是一个稳态分布的变量,因此是稳态分布变量的线性组合,因此的分布等价于    的分布;

由此,可得出对于两个原始空间的向量,其映射后的距离为,其分布等价于 的分布, 是原始空间向量之间的距离,只需证明  ,即两个向量经Hash函数映射后碰撞的概率反比于两个向量之间的 距离。

 ,则对于上述两个稳态分布,可得出:

  • Cauchy distribution:

                     

  • Gaussian distribution:

             

               是正态分布 随机变量的累积分布。

 

p-Stable Hashing 的具体使用:

由于LSH构建Hash函数的过程是独立于数据分布的,因此为了提高检索的Recall率,常采用多个Hash表,通过表之间的冗余互补来弥补Hash的ineffective,例如构建个Hash表,每个Hash表都可通过一个函数产生,其包含其个相互独立的Hash函数,将 维的原始特征 映射至 维。个表需要个Hash函数(为Hash函数集),且其相互之间要保持独立性。

 

(1) 构建Hash函数及Hash Table

基于上述构建Hash表的过程,涉及两个参数 和,通常令:

 

 

其中,为总的数据点数,  为中的,其中 通常设为1 (仅是距离的尺度变换);

系统占用的空间复杂度为 ,查询时间复杂度为 ;

取值为1时,可得出,其中 即为上述得出的距离or碰撞的概率分布函数,因此的函数,
的函数===》即为的函数,又由于影响系统性能(空间复杂度和时间复杂度)的主要因子是,因此需要优化即选取合适的使其取得极小值,约束条件: && 。其中是ANN搜索时的最近邻因子,通常是根据实际系统的性能需求确定的,因此优化过程也就退化为对于给定的,选取最优的的问题。

 

实际实践过程,对于给定的数据集(个数据点),我们要确定的就是

是'width' of Hash函数,值越大,计算Hash值的时间就越多,经Hash散列后的低维空间维度也越高,碰撞的概率就会越小;

是映射直线分割的线段长度,越小,经Hash散列后碰撞的概率就会越小;

是Hash表的个数,越大,则查询过程需要的时间越多,同时召回率(Recall)会提高,而由此产生的false positive也会变高;

实际使用中,通常会按照上述的优化过程选取参数,开源软件E2LSH中有具体实现。

(2) 查询过程

      对给定的查询向量 ,计算每个Hash表中其对应的Bucket,计算相应Bucket中所有点和的距离, 返回距离小于的点。在实际使用过程中,由于所有Bucket的点可能非常多,通常指选取一定数量的点进行距离计算并返回,常取First个点(Including duplicates)

 

 

开源软件

E2LSH:http://www.mit.edu/~andoni/LSH/

LSHKIT:http://lshkit.sourceforge.net/

 

参考文献

[1] http://en.wikipedia.org/wiki/Locality-sensitive_hashing

[2] Datar, M.; Immorlica, N., Indyk, P., Mirrokni, V.S. (2004)."Locality-Sensitive Hashing Scheme Based on p-Stable Distributions"Proceedings of the Symposium on Computational Geometry.

[3] http://www.mit.edu/~andoni/LSH/

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Python实现Locality-sensitive hashingLSH)算法的示例代码: ```python import numpy as np import hashlib # 生成一些随机数据 data = np.random.rand(1000, 10) # 设置LSH参数 num_tables = 10 num_hashes = 5 hash_size = 10 # 初始化LSH表 tables = [{} for _ in range(num_tables)] hash_funcs = [hashlib.sha1, hashlib.md5, hashlib.sha256, hashlib.blake2s, hashlib.sha3_256] # 建立LSH表 for i in range(num_tables): for j in range(1000): hash_values = [] for k in range(num_hashes): hash_value = hash_funcs[k](data[j].tostring()).hexdigest()[:hash_size] hash_values.append(hash_value) hash_key = ''.join(hash_values) if hash_key not in tables[i]: tables[i][hash_key] = [] tables[i][hash_key].append(j) # 查询近似相似的数据点 query = np.random.rand(10) query_hash_values = [] for k in range(num_hashes): hash_value = hash_funcs[k](query.tostring()).hexdigest()[:hash_size] query_hash_values.append(hash_value) query_hash_key = ''.join(query_hash_values) similar_points = set() for i in range(num_tables): if query_hash_key in tables[i]: similar_points.update(tables[i][query_hash_key]) print(similar_points) ``` 这段代码生成一个大小为1000的随机数据集,并使用LSH算法建立10个LSH表。然后,给定一个查询点,代码计算查询点的哈希值,并在每个LSH表中查找具有相同哈希值的数据点。最后,代码返回所有这些数据点的索引,这些数据点与查询点相似。在实际应用中,可以使用更复杂的哈希函数和更多的LSH表来提高准确性和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值