局部敏感哈希之KSH

  • 核函数Kernel Function

    • 流程
    • 分析
  • 监督信息Supervised Information
  • 内积法计算相似度Code Inner Product
  • 目标函数Objective Function
  • 贪心算法求解Greedy Optimization
  • 频谱化宽松Spectral Relaxation
  • Sigmoid平滑Sigmoid Smoothing
  • 最终算法
  • 参考文献

局部敏感哈希文中,分析了局部敏感哈希方法是如何应用在检索过程中的,以及原始的哈希方法和基于p-stable分布的哈希方法。

转载请注明:http://blog.csdn.net/stdcoutzyx/article/details/44746839

原始的哈希方法和基于p-stable分布的哈希方法都是随机产生的,其效果受随机函数的限制并会产生动荡。本文中描述一种有监督学习的哈希方法,根据不同的数据学习到不同的哈希方法,相对于随机产生的方法具有较大的优势。本文介绍的方法的原始论文在[1],名为KSH,即Kernel-Based Supervised Hashing。KSH方法要点如下:

  • Kernel Function
  • Supervised Information
  • Code Inner Product
  • Objective Function
  • Greedy Optimization
  • Spectral Relaxation
  • Sigmoid Smoothing

这些要点共同组合成了KSH方法一整套的使用与训练流程。下面将为大家一一介绍。

核函数(Kernel Function)

流程

核哈希的方法继承于[2],具体操作如下:

首先,从数据中取m个点,称之为锚点(anchor point),m是KSH的重要参数之一。

对一个点x来说,需要先计算x与锚点的核函数值,得到m维向量,如下面公式,其中下标为样本标记。核函数的选择也是KSH需要控制的参数。

然后,在使用一个m维向量a与上述向量求内积,在减去偏差b,a和b都是KSH的参数。

上述公式得到一个实数,可以根据该数的符合,将其二值化。

这样,就将数据转化成了一个汉明码。当有r组(a,b)参数时,就可以将数据转化为r位汉明码。

为了保证学习到的汉明编码中保存的信息量最大,需要保证:

于是,b应该等于f(x)公式中的第一项的和的中值。

将b代入f(x),得到:

分析

在上述流程中,a可以用随机的方法产生。但在KSH,要根据标注数据对a进行学习。

注意到上述流程中Kernel的作用,对数据进行第一步的处理,这样做的好处是可以降维,比如,原始数据是10000维,但若选择500个锚点,那么,生成的数据就变成了500维,大大降低了需要学习的参数a的数目。

监督信息(Supervised Information)

既然KSH是监督学习算法,那么需要标注信息,在KSH算法中,其标注信息是一个矩阵S。

KSH的标注信息可以如下得到,从样本集中选取L个样本,然后形成一个L*L的矩阵,矩阵中(i,j)处的值表示样本i和样本j是否相似。这种信息实质上是pair信息,即pair对中两个样本是否是相似。

内积法计算相似度(Code Inner Product)

假设已经学习到了参数a,那么可以得到汉明编码,如果汉明编码一致,说明两个样本是相似样本,否则不是。汉明编码的相似度的计算是异或计算,但是,在学习过程中,我们要以汉明编码相似度去反推参数a,使用异或计算很难求导。于是,需要将异或运算进行转化。转化方法为:

将汉明编码中的0值换成-1,两个汉明编码的内积与原来的相似度就有了一一对应的关系,推导如下:

其中, code函数样本转换为(1/-1)的汉明码,D函数求取汉明码的汉明距离。由于内积的范围在[-r,r],为了将其归一化到[-1,1],需要再让内积除以r。如下图所示:

目标函数(Objective Function)

目标函数如下:

其中,H为L*r的矩阵,L为监督信息中样本的数目,r为汉明编码的位数。S为监督信息矩阵。

将目标函数展开,得到:

其中,K为L×m的矩阵,m为锚点数目,代表着做完核函数处理的样本数据,A为m×r的矩阵,即参数a。

贪心算法求解(Greedy Optimization)

将目标函数再度展开:

直接求解难度大大滴,因而,论文提出了一种贪心算法,求取较优解。贪心的方式就是逐位求解,首先求a1,然后a2,直到ak。

为了逐位求解,首先需要定义剩余矩阵,即目标函数中的第二项S,再求完一位后会如何变化。如下

显然,R0=rS。其中a*是已经求完的参数。

那么,单个求解的目标函数为:

在第一步等式中,第一项永远等于L的平方,R也不随着a的变化而变化,因而,它们都是常量。

所以,单步的目标函数就变为:

频谱化宽松(Spectral Relaxation)

为了对上述目标函数求解,对目标函数进行放宽。得到:

其中,需要满足的条件就是从没有去掉sgn函数的结果中引申出来的。该问题是一个标准的求特征向量问题:

其中,ak就是该问题的对应最大特征值的特征向量。求出该值后,并不将其当做最后的求出的值,而是作为初始值然后使用下面的方法再进行优化。

Sigmoid平滑(Sigmoid Smoothing)

上述频谱化宽松似乎宽松的过了头,此处使用一种更加接近sgn函数的方法对其进行平滑处理。

其中,phi函数就是对sgn函数的模拟,在[-6,6]外几乎完全接近sgn函数。

添加了平滑处理后,就可以使用梯度下降进行求解了。梯度如下:

最终算法

最终算法流程如图:

参考文献

[1]. Liu W, Wang J, Ji R, et al. Supervised hashing with kernels[C]//Computer Vision and Pattern Recognition (CVPR), 2012 IEEE Conference on. IEEE, 2012: 2074-2081.

[2]. Kulis B, Grauman K. Kernelized locality-sensitive hashing[J]. Pattern Analysis and Machine Intelligence, IEEE Transactions on, 2012, 34(6): 1092-1104.

时间: 2024-08-05 06:16:06

局部敏感哈希之KSH的相关文章

局部敏感哈希简介

上一年记录的东西,整理下... LSH,是Locality Sensitive Hashing的缩写,也翻译为局部敏感哈希,是一种通过设计满足特殊性质即局部敏感的哈希函数,提高相似查询效率的方法. 虽然从正式提出距今不过十余年,由于其局部敏感的特殊性质,以及在高维数据上相当于k-d树等方法的优越性,LSH被广泛地运用于各种检索(包括并不仅限于文本.音频.图片.视频.基因等)领域. 一.哈希检索概述 1.1 检索分类 在检索技术中,索引一直需要研究的核心技术.当下,索引技术主要分为三类:基于树的索

局部敏感哈希LSH

之前介绍了Annoy,Annoy是一种高维空间寻找近似最近邻的算法(ANN)的一种,接下来再讨论一种ANN算法,LSH局部敏感哈希. LSH的基本思想是: 原始空间中相邻的数据点通过映射或投影变换后,在新空间中仍然相邻的概率很大,而不相邻的数据点映射后相邻的概率比较小. 也就是说,我们对原始空间中的数据进行hash映射后,希望相邻的数据能够映射到Hash的同一个桶内. 对所有的原始数据进行hash映射后,就会得到一个hashtable,这个hashtable同一个桶内的数据在原始空间中相邻的概率

R语言实现︱局部敏感哈希算法(LSH)解决文本机械相似性的问题(二,textreuse介绍)

上一篇(R语言实现︱局部敏感哈希算法(LSH)解决文本机械相似性的问题(一,基本原理))讲解了LSH的基本原理,笔者在想这么牛气冲天的方法在R语言中能不能实现得了呢? 于是在网上搜索了一下,真的发现了一个叫textreuse的包可以实现这样的功能,而且该包较为完整,可以很好地满足要求. 现在的版本是 0.1.3,最近的更新的时间为 2016-03-28. 国内貌似比较少的用这个包来实现这个功能,毕竟R语言在运行大规模数据的性能比较差,而LSH又是处理大规模数据的办法,所以可能国内比较少的用R来执

为什么要用局部敏感哈希

一.题外话 虽然是科普,不过笔者个人认为大道至简,也就是说越简单的东西很可能越值得探讨,或者另外一种说法越简单的东西越不好讲解:其实笔者认为这就是<编程之美>所要传递的——大道至简. 软件构建老师给我推荐的<走出软件作坊>还没看呢. 二.概述 高维数据检索(high-dimentional retrieval)是一个有挑战的任务.对于给定的待检索数据(query),对数据库中的数据逐一进行相似度比较是不现实的,它将耗费大量的时间和空间.这里我们面对的问题主要有两个,第一,两个高维向

基于局部敏感哈希的协同过滤算法之simHash算法

搜集了快一个月的资料,虽然不完全懂,但还是先慢慢写着吧,说不定就有思路了呢. 开源的最大好处是会让作者对脏乱臭的代码有羞耻感. 当一个做推荐系统的部门开始重视[数据清理,数据标柱,效果评测,数据统计,数据分析]这些所谓的脏活累活,这样的推荐系统才会有救. 求教GitHub的使用. 简单不等于傻逼. 我为什么说累:我又是一个习惯在聊天中思考前因后果的人,所以整个大脑高负荷运转.不过这样真不好,学习学成傻逼了. 研一的最大收获是让我明白原来以前仰慕的各种国家自然基金项目,原来都是可以浑水摸鱼忽悠过去

局部敏感哈希(Locality Sensitive Hashing)

比较不同的文章.图片啊什么的是否相似,如果一对一的比较,数据量大的话,以O(n2)的时间复杂度来看,计算量相当惊人.所以如果是找相同就好了,直接扔到一个hashmap中即可.这样就是O(n)的复杂度了.不过相同的字符串一定会得到相同的hash,而不同的字符串,哪怕只有一点点不同,也极可能得到完全不同hash.很自然的想到,要是相似的object能够得到相似的hash就好了.局部敏感哈希就是这样的hash,实现了相似的object的hash也是相似的. 定义相似 要找相似,首先是要定义什么事相似.

局部敏感哈希(Locality-Sensitive Hashing, LSH)方法介绍(转)

局部敏感哈希(Locality-Sensitive Hashing, LSH)方法介绍 本文主要介绍一种用于海量高维数据的近似最近邻快速查找技术--局部敏感哈希(Locality-Sensitive Hashing, LSH),内容包括了LSH的原理.LSH哈希函数集.以及LSH的一些参考资料. 一.局部敏感哈希LSH 在很多应用领域中,我们面对和需要处理的数据往往是海量并且具有很高的维度,怎样快速地从海量的高维数据集合中找到与某个数据最相似(距离最近)的一个数据或多个数据成为了一个难点和问题.

【常用算法】KDTree,局部敏感哈希LSH,在基于最近邻的算法中,当N特别大的时候(TODO)

基于最近邻的算法,在各种情况下经常使用, 比如10万个用户,对每一个用户分别查找最相似的用户, 当N特别大的时候,效率就不是很高,比如当N=10^5,时已经不太好算了,因为暴力法时间复杂度为O(N^2). 故需要特殊的手段,这里有两个常用的方法, 一个是KDT树(还有Ball Tree),一个是局部敏感哈希(近似算法,得到得是满足一定置信区间的结果) KDT: O(N*longN) 局部敏感哈希(LSH):跟桶大小有关 1#  K-Dimensional Tree,KDT, https://en

局部敏感哈希(Locality-Sensitive Hashing, LSH)

转自局部敏感哈希(Locality-Sensitive Hashing, LSH) 一.局部敏感哈希LSH 在很多应用领域中,我们面对和需要处理的数据往往是海量并且具有很高的维度,怎样快速地从海量的高维数据集合中找到与某个数据最相似(距离最近)的一个数据或多个数据成为了一个难点和问题.如果是低维的小数据集,我们通过线性查找(Linear Search)就可以容易解决,但如果是对一个海量的高维数据集采用线性查找匹配的话,会非常耗时,因此,为了解决该问题,我们需要采用一些类似索引的技术来加快查找过程