spectral hashing--谱哈希源码解析

论文里面看到了谱哈希用来找子集的用处,不管有没有用,先转再说

原文地址:http://blog.sina.com.cn/s/blog_67914f290101d2xp.html

最近看了有关谱哈希的一些东西,记录一下备忘。理解十分粗浅,敬请各位大牛指导。

一、基本概念
   语义哈希(semantic hashing)是为每个对象(图像或文本)寻找一种二进制编码,使两个对象的相似度与其编码之间的海明距离相关(即相似度高的对象对应的编码海明距离小,相似度低的对象对应的编码海明距离大)。而为每个对象寻找这么一个最优化的编码是NP难解问题,通过松弛优化条件,得到一种谱问题,这个问题的结果是拉普拉斯算子的特征向量的一个子集。这种对松弛后问题的解决方法就是谱哈希。

二、计算编码
   好的编码要满足以下条件:容易计算;短但能表示整个数据集;其海明距离与原对象之间的相似度相关。
   松弛后谱问题的结果是带权拉普拉斯-贝尔特拉米算子的特征方程,通过构造这样的特征方程,并计算其前k个最小的特征值,最后所得到的编码与特征值相关。
   整个过程涉及比较高级的数学知识,超过了我的知识范围,因此理解的十分粗浅。

三、源码分析
   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行转换为二进制为0001011100101001,其海明距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(查全率与查准率的宏观值)。
      这个并不是绝对的,根据自己的实际情况来写。

四、注意
       因为在谱哈系松弛过程中有数据点符合均匀分布的假设,因此这种方法不适用于维度通常很高并且数据矩阵特别稀疏的文本查询。普通文本集都具有数万至数百万级别的维度,并且数据矩阵极为稀疏,这种数据集应用谱哈系所得结果会很差,而如果要得到较好的结果,只能对其进行预降维,这样会损失很多信息,也不会得到特别好的结果。因此,谱哈系通常更适用于图像检索。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/246704.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【PTVS+Theano+CPU/GPU】在windows下使用VS安装theano深度学习工具

唉。好不容易折腾完毕caffe,突然发现caffe比较适合搭建卷积神经网络,而对于DBN和LSTM的搭建好像比较麻烦,相关教程没有找到,手头上又有一个theano的代码想调试看看,所以入坑了。 准备工具: VS2013:链接&a…

人工神经网络——【BP】反向传播算法证明

第一步:前向传播 【注】此BP算法的证明仅限sigmoid激活函数情况。本博文讲道理是没错的,毕竟最后还利用代码还核对了一次理论证明结果。 关于更为严谨的BP证明,即严格通过上下标证明BP的博客请戳这里 简单的三层网络结构如下 参数定义&…

参数模型和非参数模型的区别

原文地址:http://blog.csdn.net/gao1440156051/article/details/44003051 参数与非参数模型  用代数方程、微分方程、微分方程组以及传递函数等描述的模型都是参数模型。建立参数模型就在于确定已知模型结构中的各个参数。通过理论分析总是得出参数模型。非参数模…

【matlab函数】——str2func函数的使用

官方点的叫法,在网上被称为函数句柄 用途在于,比如你定义了两个函数:strupper()用于寻找字符串的大写字母数目;strlower()用于寻找字符串的小写字母数目 现在使用str在这里面调换使用如下: funcstr;%统一前缀 myfuncstr2func(fu…

什么是NP完全问题?

本文转自:http://blog.csdn.net/xueyong4712816/article/details/6509592 NP完全问题,是世界七大数学难题之一,排在百万美元大奖的首位,够诱惑力吧!咋不求得奖只需要了解了解它是什么就可以了。 什么是NP完全问题,NPN…

【caffe-Windows】微软官方caffe之 matlab接口配置

前言 按照微软的官方地址配置可能会出现一个问题caffe_.mexw64找不到引用模块问题,或者在matlab里面压根找不到caffe_这个函数,下面会提到这两个问题。还是按照步骤来吧 【PS1】有GPU同样按照下述步骤,进行即可 【PS2】文章在matlab2013a、…

【混淆矩阵】matlab画混淆矩阵

主要借鉴此博客代码:http://blog.csdn.net/sherry_gp/article/details/50560003 但是这个博主的代码达不到我想要的效果,所以修改了一下 我想要实现的效果是:给定一列的预测标签,以及这一列标签的哪一部分理应属于哪一部分标签。…

【caffe-Windows】mnist实例编译之model的生成

其实这个和cifar的实例基本相同,只不过数据转换的方法不一样 【说明,此博客按照我自己的路径设置的相关操作,读者如果自行选择其他路径,记得在bat和prototxt等文件修改路径】 第一步 下载数据集THE MNIST DATABASE of handwrit…

吉布斯采样——原理及matlab实现

原文来自:https://victorfang.wordpress.com/2014/04/29/mcmc-the-gibbs-sampler-simple-example-w-matlab-code/ 【注】评论区有同学指出译文理论编码有误,请参考更官方的文献,个人当时仅验证过红色字体部分理论与维基百科中二位随机变量吉…

【matlab知识补充】conv2、filter2、imfilter函数原理

原文地址:http://www.ilovematlab.cn/thread-293710-1-1.html -------------------------------------conv2函数---------------------------------------- 1、用法 Cconv2(A,B,shape); %卷积滤波 复制代码A:输入图像,B:卷积核假设输入图像A大…

【matlab函数】diff函数

diff函数是用来求导数的 更新日志:2021-3-16 经评论区SHolmesCSU 指正,此函数为求解差分,而非导数。 在matlab官方文档中,利用差分近似导数需要除以步长,即 diff(X)/step_size 目前用到的调用格式为diff(A&#x…

显示mnist手写数字

前言 可视化什么的,总是好的 方法一 其实也就是用到了Ruslan Salakhutdinov and Geoff Hinton提供的工具包 % Version 1.000 % % Code provided by Ruslan Salakhutdinov and Geoff Hinton % % Permission is granted for anyone to copy, use, modify, or distr…

【matlab函数】convn多维卷积

简单的卷积就不说了,向量卷积用此函数与用conv效果相同,矩阵卷积用此函数与conv2的二维卷积效果相同。 此函数的方便之处在于支持三维卷积:其实相对于conv2来说就是省了一个for循环。对于三维卷积,比如A矩阵大小为[2,3,3]&#x…

【caffe-Windows】mnist实例编译之model的使用-classification

仿照cifar10的模型使用,本文对mnist的训练方式做了部分修改 【注】本文caffe安装路径为E:\CaffeDev-GPU\caffe-master。请自行参考并修改相关路径(debug以及release参考你编译caffe时候采用的模式) 第一步 按照前面的model生成方法的前两步骤制作数据集&#xff…

误差error,偏置bias,方差variance的见解

更新日志:2020-3-10 谢谢ProQianXiao的指正。偏差-方差的确是在测试集中进行的。 之前的误解是,偏差和方差的计算是同一个模型对不同样本的预测结果的偏差和方差;而实际上是不同模型对同一个样本的预测结果的偏差和方差。 这时候就要祭出网…

【caffe-Windows】以mnist为例lmdb格式数据

前言 前面介绍的案例都是leveldb的格式,但是比较流行和实用的格式是lmdb,原因从此网站摘取 它们都是键/值对(Key/Value Pair)嵌入式数据库管理系统编程库。虽然lmdb的内存消耗是leveldb的1.1倍,但是lmdb的速度比level…

【caffe-Windows】mnist实例编译之model的使用-matlab

前言 针对上一个caffe文章留下的matlab手写数字识别的问题,感谢caffe中文社区的 ghgzh 的提示,原文请看:caffe中文社区 第一步 手写图片的制作方法我就不说了,直接把我自己画的几个数字放到云盘先: 三通道图像以及…

【caffe-Windows】训练自己数据——数据集格式转换

前言 看了mnist和cifar的实例,是不是想我们现实中一般都是一张张的图片,和实例里面都不一样呢?那么如何来进行训练呢?为了能够简便点,我们就不自己去采集数据集了,因为第一自己采集的数据集量可能不够&…

【caffe-windows】Linux至Windows平台的caffe移植

1、前言 主要参考两篇博客以及很多论坛解决细节问题: http://www.cnblogs.com/trantor/p/4570097.html https://initialneil.wordpress.com/2015/01/11/build-caffe-in-windows-with-visual-studio-2013-cuda-6-5-opencv-2-4-9/ 移植环境:Windows7…

【caffe-matlab】权重以及特征图的可视化

前言 移植了各种caffe,是时候进行下一步操作了,先拿可视化下手吧。大部分内容可能跟网上的方法不一样,大家看完我的博客最好去网上看看大牛们的博客,万一被我误导了,就罪过了o(╯□╰)o,开更.............…