语义哈希(semanticHashing)是指将高维空间向量映射至低维汉明空间,并保持原空间向量相似性,使得新空间向量的汉明距离反映原空间向量相似度的哈希算法。语义哈希引入了近似的概念,认为在海量数据的搜索中,在大多数情况下,完全精确的查找并不是必须的,近似解己经足以满足用户绝大多数的要求,因而通过哈希算法迅速定位数据集中一定概率下与搜索关键词相关的数据,配合汉明空间相似度度量的快速性和索引结果容易进一步扩展的特点,可以大幅提高索引和检索的效率。
位置敏感哈希(LoealitySensitiveHashing一LsH)
http://wenku.baidu.com/link?url=HHfgD1-ba7NZi9OkTX_moYqdNtqfU8HORnVTalnGo11F9G-l66bBLeI2dPWugxTSZxab4wpmrRoIB0gBskY_5uIcx2Qu1l41GMq7bo6FbPO
http://blog.csdn.net/zwwkity/article/details/8559301
受限的波尔兹曼机(RestrietedB。ItzmannMaehine)
RBM算法首先通过pretraining,采用纵向的分层的非线性的学习方式,从原始数据开始不断向上学习产生单个的RBM机,使得高维数据点转化为低维数据,并通过微调调整参数和权重确定模型,得到最终的二元索引结果。
在预训练阶段,由训练集开始向上训练,每一层得到一个独立的RBM,每一层的训练结果位数为可调节的参数,下层的训练结果作为上层训练的数据,最高层的训练结果位数为最终的索引结果位数,从而得到一个纵向的多层深度学习模型。在微调阶段,通过结合层之间的关系进一步修正每一层的RBM,从而得到自动编码机(Auto encode:)。对于训练集外的数据,直接应用自动编码机即可得到最终的索引结果。
RBM作为一种概率图模型,引入了概率就可以使用采样技术求解。能量模型需要一个定义能量函数,每个可视节点和隐藏节点之间的连接结构都有一个能量,将可视节点的一组取值(是一个训练样本的值)和隐藏节点的一组取值(也就是这个训练样本编码后的值)代入公式,就能得到这个连接结构之间的能量。引入能量模型的目的是为了方便求解目标——让RBM网络的表示Gibbs分布最大可能的拟合输入数据。结论就是求解输入样本的极大似然。
谱哈希(spectralHashing—SH)
谱哈希重新整理了语义哈希的思路,将语义哈希函数的构造与谱分析技术相结合,尝试从全新的角度得到语义哈希函数。谱哈希在对编码条件合理分析的前提下,对高维数据样本集进行谱分析,再引入特征函数(Eigenfunction),在数据集服从高维平均分布的前提下给出哈希函数。通过主成份分析法(prineipleConentAnalysis—pCA)对高维数据进行降维,得到各个维度互不相关的低维数据,进而对结果直接进行二元索引结果计算。
文中通过spectral hashing 将特征转为32位或者64位。
基本算法流程是:
1 通过PCA得到数据的主成分
2 沿着每个PCA方向通过近似矩形计算单维特征函数L(最小有k个特征值)。这是在每个方向上通过公式7计算k个最小特征值:计算dk个特征值的一个列表,然后对该列表进行排序,以找到k个最小特征值
3 将特征函数进行二值化,得到二进制编码。
查找最后就是通过二进制编码的汉明距离来进行匹配。
文章中没用使用任何的局部描述子特征,进行比较的算法也没提到是否采用局部描述子。最后对比了Gist特征――全局描述符的图像对比效果。
algorithm analyse : http://blog.csdn.net/zwwkity/article/details/8568994
source code PDF和源码的下载地址:http://www.cs.huji.ac.il/~yweiss/SpectralHashing/
源码中与谱哈希相关的主要有以下几个文件:trainSH.m,compressSH.m,distMat.m,hammingDist.m,evaluation.m。下面一一介绍。
1、trainSH.m。输入数据矩阵(每一行代表一个点),通过训练得到谱哈希中所需的若干参数,包括对数据矩阵的PCA(主成分分析)处理及生成特征方程。
主成分分析是一种对数据降维的方法,减少数据量的同时能尽量避免有用信息的流失。对一个矩阵提取主成分,即对矩阵中的每一行对应的向量提取主成分(对一个数据矩阵,每一行即每一数据点可看做所有随机变量的一次取值,而每一列即每一维可看做一个随机变量),只看矩阵中的其中一行,不妨设第一行,其元素值为x1,x2,…,xd,则其主成分是d个随机变量的一个线性组合,即ai1x1+ai2x2+…+aidxd,而ai1,ai2,…,aid是随机变量X1,X2,…,Xd的相关矩阵的第i个特征向量。因此,计算矩阵X的协方差矩阵(矩阵X有d列,代表d维,也代表d个随机变量,协方差矩阵中元素即是d个随机变量两两之间的协方差)Cov,矩阵Cov为d*d矩阵,计算矩阵Cov的特征向量和特征值,并从大到小取出前k个特征值对应的特征向量组成变换矩阵T,T为d*k矩阵,计算X*T,即提取出X的前k个主成分,因为X*T是s*k矩阵(s为矩阵X原先的长度),故X由原先的d维降到了k维,并且这k维包含了X最多的信息。
原文中说选取了从小到大的k个特征值,而源码实现中选取了从大到小的k个特征值,源码实现中应该是正确的选择,也许我对原文理解有误,如果有熟悉谱哈希的,希望同志们能留言相告。
2、compressSH.m。输入数据矩阵和参数(来自trainSH.m的输出),输出U和B。U是k个特征方程的值,是个s*k的矩阵,每一行代表一个数据点,每一列代表一个特征方程的值(用来生成二进制编码)。B是s*ceil(k/8)的矩阵,其中B(i,j)的值等于矩阵U的第i行的第(j-1)*8+1到第j*8个元素(如j=1,则是第1到第8个元素,j=2,则是第9到第16个元素,以此类推)的压缩十进制值。即先将矩阵U的元素按其正负转换成1和0(正对应1,负对应0),然后将8个01值转换成十进制,即得到B中的元素值,8个01值中,维度较低的值处于低位,维度高的值处于高位。比如U的第一行的前八个数为:1,-0.7,-0.5,1,0.3,-0.4,0.2,1,转换后为10011011,左边为低位,右边为高位,转换成十进制数位217,则B(1,1)=217。
3、hammingDist.m。输入B1,B2(compressSH.m的输出),设B1为s1*ceil(k/8)矩阵,B2为s2*ceil(k/8)矩阵,则输出为s1*s2矩阵D,其中D(i,j)为B1第i行与B2第j行的海明距离(D=compressDist(B1,B2))。设B1第1行为12 14,B2第2行为23 41,则B1第1行转换为二进制为0000110000001110,B2第2行转换为二进制为00010111001
01001,其海明距
离
为
8,则D(1,2)=8。
4、distMat.m。输入为两个矩阵或一个矩阵。若输入两个矩阵,计算两个矩阵两两行之间的欧式距离;若是一个矩阵,计算该矩阵中两两行之间的欧式距离。输入一个矩阵即为输入两个相同矩阵,下只考虑输入为两个矩阵。设这两个矩阵为M1和M2,M1为s1*d矩阵,M2为s2*d矩阵,则输出的距离矩阵D为s1*s2矩阵,其中D(i,j)为M1第i行和M2第j行的欧式距离(l2准则下的欧式距离)。
5、evaluation.m。这里面包括确定kNN问题中的k值(即距离为k以内的点方视为近邻),及对查询集计算其查准率与查全率。首先对训练集(数据集)进行训练,设训练集为矩阵M,计算distMat(M)得到矩阵D,矩阵D中第i行各元素表示M中第i行与其余各行之间的欧式距离。对D按行进行排序,并求出某选定列的平均值作为近邻查询的半径。若选定第3列,因为第3列的各值表示全部数据集中每一点与其他各点的欧式距离的第三小值,因此可以将此值作为要平均查找3个近邻时所需的半径阈值。返回的查全率(recall)与查准率(precision)均是n*1矩阵,其中n在程序中定义,recall和precision中的第i行表示查找海明距离小于i的点作为候选点,在选出的候选点集中计算对应的查全率与查准率。evaluation.m中第24行中:score = zeros(20,1),即初始n设置为20,用户可以根据自己数据的特点进行修改。
6、Demo。写Demo的步骤如下:
(1)利用训练集及要查找的平均近邻数确定可视为近邻的最大距离(确定True Neighbor)。
(2)计算查询集中每个查询子与所有点之间的距离,并得到一个近邻矩阵N。N(i,j)为1表明第i个查询子与第j个数据点是True Neighbor,为0表示不是True Neighbor。该矩阵用于计算spectral hashing查询结果的recall和precision值。
(3)利用spectral hashing算法为每个数据点分配二进制编码,并计算查询子与各数据点之间的海明距离。
(4)定义确定候选集的阈值,N=该阈值内查找到的所有点数(候选集点数),n=候选集中是True Neighbor的点数,M=所有查询子的True Neighbor点数。则recall=n/M,precision=n/N(查全率与查准率的宏观值)。
这个并不是绝对的,根据自己的实际情况来写。
BOW: Bag of words
模型最初被用在文本分类中,将文档表示成特征矢量。它的基本思想是假定对于一个文本,忽略其词序和语法、句法,仅仅将其看做是一些词汇的集合,而文本中的每个词汇都是独立的。简单说就是讲每篇文档都看成一个袋子(因为里面装的都是词汇,所以称为词袋,Bag of words即因此而来),然后看这个袋子里装的都是些什么词汇,将其分类。
SIFT特征虽然也能描述一幅图像,但是每个SIFT矢量都是128维的,而且一幅图像通常都包含成百上千个SIFT矢量,在进行相似度计算时,这个计算量是非常大的,通行的做法是用聚类算法对这些矢量数据进行聚类,然后用聚类中的一个簇代表BOW中的一个视觉词,将同一幅图像的SIFT矢量映射到视觉词序列生成码本,这样每一幅图像只用一个码本矢量来描述,这样计算相似度时效率就大大提高了。
构建BOW码本步骤:
1. 假设训练集有M幅图像,对训练图象集进行预处理。包括图像增强,分割,图像统一格式,统一规格等等。
2、提取SIFT特征。对每一幅图像提取SIFT特征(每一幅图像提取多少个SIFT特征不定)。每一个SIFT特征用一个128维的描述子矢量表示,假设M幅图像共提取出N个SIFT特征。3. 用K-means对2中提取的N个SIFT特征进行聚类, 得到 k 个聚类中心作为视觉单词表,K-Means算法是一种基于样本间相似性度量的间接聚类方法,此算法以K为参数,把N个对象分为K个簇,以使簇内具有较高的相似度,而簇间相似度较低。聚类中心有k个(在BOW模型中聚类中心我们称它们为视觉词),码本的长度也就为k,计算每一幅图像的每一个SIFT特征到这k个视觉词的距离,并将其映射到距离最近的视觉词中(即将该视觉词的对应词频+1)。完成这一步后,每一幅图像就变成了一个与视觉词序列相对应的词频矢量。