time svd java代码_ITQ算法理解 - 漫长当下TIME的个人空间 - OSCHINA - 中文开源技术交流社区...

article/2025/5/14 6:18:47

IterativeQuantization: A Procrustean Approach to Learning Binary Codes 论文理解及代码讲解

这篇文章发表在2011年CVRP上,一作是Yunchao Gong,师从Sanjiv Kumar,关于Sanjiv Kumar可以到她的HomePage上了解。

文章目的:学习保留相似度的二值码,以用于高效的在大规模数据集中做图像检索。本文介绍了在无监督的数据集中用PCA来学习ITQ,在有监督的数据集中用CCA来学习ITQ。

首先介绍学习二值码的重要性:

计算机视觉越来越重视学习相似性保存的二进制代码来代表大规模的图像集合。它主要有三个优点:

(1)     用短的二值码来代图像,可以在内存中存储大量的图像。

(2)     比较两幅图像相似性,用二值码来计算hamming距离,非常快速,高校。

(3)     用这个方法可以代替大规模图像索引方法。

学习二值码有三个重要的特性:

(1)     编码要短。(16G的内存,存储250million图像在内存里的话,对于每图像只能使用64bits)

(2)     图像映射到二值码后,两个编码要尽可能的相似,也就是原来两幅图像距离大,映射到二值码后,hamming距离也很大。

(3)     用来学习二值码的算法要足够的高效,并且对新的图像编码成二值码要efficient。

ITQ的思想:

(1)     用PCA对原始数据进行降维(如果有监督则用CCA来降维)

(2)     然后把把原始数据分别映射到超立方体的顶点,因为超立方体的顶点是二值码,求解量化误差最小的映射方式。量化二值码的方法是:hk(x) = sgn(xwk),用sgn函数来量化。

(3)     本文的创新点是对这个超立方体在空间中旋转,然后求解初旋转矩阵就可以得到最好的映射方式。

(注意:文章不是直接对超立方体进行旋转,而是对数据进行旋转后,再映射到立方体上,相当于物理上运动的相对性,数据旋转,立方体不动,可以看成数据不动,立方体在旋转,一样的道理,文章为了方便求解旋转矩阵,对数据进行旋转。)

对于unsupervised code learning

ITQ 步骤可以简答的概括为(将原始d维向量映射到c维的二值码):

(1)假设数据是centralized,如果不是,用程序进行centralized。X是原始数据(n*d维矩阵),中心化的matlab代码:

(2)将原始数据做一个PCA投影,这一步主要是为了降维。具体PCA降维过程不做过多赘述。

(求解离散度矩阵的特征值,选出前C个最大特征值对应的特征向量做为投影矩阵,这样就把原始数据降维到c维)

(3)二值量化

假设第二步求得降维矩阵维W,然后将数据映射到了空间中的一个一个点,现在就是要将空间中的点映射到一个边长为1的超立方体中,以原点为空心,方方正正的放在空间中的超立方体是二值码的(为方面记这个超立方体为Q0)。但如果我们对数据进行一个旋转再映射到这个空间中,会得到更小的量化误差。这个想法类似于如果我们只是要将数据映射到边长为1的立方体中,而不需要固定超立方体的具体位置,这就等同于对数据进行旋转,再映射到以Q0。

降维后的数据:V=XW

旋转后的数据:VR   (R是旋转矩阵,必须是c*c维的正交矩阵)

最小化映射误差:

1841928

等价于:

1841928

问题等价于最大化:

1841928

1841928

但是这里R也是未知的,B也是未知的,对于求解这样的为题,我们使用迭代求解的方法,固定一个,优化另一个。

求解这个问题分两步:

(1)    固定R,求解B

由于R是正交矩阵,作者使用随机初始化R为正交矩阵。随机的方法:

R = randn(bit,bit);  // 随机生成一个矩阵

[U11 S2 V2] = svd(R); //对矩阵做SVD分解,U和V都是正交矩阵

R = U11(:,1:bit);   //选取U作为随机初始化的正交矩阵R

R固定了,求解B相当简单。最大化

1841928

因为这里B的元素只有1和-1(因为是二值码,作者用-1表示0,这样只是为了求解问题简单),所以B =sgn(V R)。

(2)      固定B,求解R

1841928

这是一个线性代数的问题orthogonal Procrustes problem。

这个为题的原型是对A做一个正交投影,于B尽量相似:

1841928

1841928

所以本文中,

1841928

文章迭代求解50步,即可得到最后二值码的编码方式。

% ITQ to find optimal rotation

for iter=0:n_itr

if mod(iter,10)==0

fprintf('ITQ: iter: %d \n', iter);

end

Z = V * R;

UX = ones(size(Z,1),size(Z,2)).*-1;

UX(Z>=0) = 1

C = UX' * V;

[UB,sigma,UA] = svd(C);

R = UA * UB';

end

% make B binary

B = UX;

B(B<0) = 0;

求得B,R之后,整体的编码方式是:

BincodeXtrainingITQ =compactbit(bsxfun(@minus, Xtraining, sample_mean) * eigVec * R > 0);

利用label信息的ITQ二值码的映射:

给你一个训练集矩阵X,n*d维,一共n个向量,每个向量有d维。现在额外给你一个带标签的矩阵Y,n*t维,你是训练集矩阵的向量个数,t是标签的个数,Y(i,j)=1,表示训练集中的第i个向量和第j个标签有关系。反之Y(i,j)=0表示训练集中的第i个向量和第j个标签没有关系。对PCA比较了解的人都知道,PCA是无监督的降维方法。PCA降维出来的矩阵只是最大限度的保留矩阵的能量,但是不能确保选择的投影pc对于分类是有用的,比如原来的数据是完全可分的,但用PCA降维后完全不可分。所以作者给出了利用带标签的降维方法,CCA。

CCA 的英文全称是Canonical Correlation Analysis,目标是找到特征的投影W矩阵和标签的投影矩阵U,是的投影后的XW和YU的相关性最大。

1841928

1841928

在本文中,作者使用

1841928

如果我们得到了W,就不用得到U,应为我们得到W的作用是对数据进行降维,而U在以后的ITQ过程中是无用的。

得到降维矩阵后,其余操作和前面相同。


http://chatgpt.dhexx.cn/article/GHBERSeW.shtml

相关文章

Iterative Quantization,ITQ

Abstract 针对大规模的图像检索问题&#xff0c;论文提出了一个高效的ITQ算法。该算法先将中心化后的数据映射到超立方体的顶点上&#xff0c;再通过优化过程寻找一个旋转矩阵&#xff0c;使得数据点经过旋转后&#xff0c;与超立方体的顶点数据具有最小的量化误差。ITQ算法涉及…

ITQ算法理解

开发十年&#xff0c;就只剩下这套Java开发体系了 >>> IterativeQuantization: A Procrustean Approach to Learning Binary Codes 论文理解及代码讲解 这篇文章发表在2011年CVRP上&#xff0c;一作是Yunchao Gong&#xff0c;师从Sanjiv Kumar&#xff0c;关于San…

ITQ(Iterative Quantization)图像检索算法

开发十年&#xff0c;就只剩下这套Java开发体系了 >>> 1、文章简介 名称&#xff1a;Iterative Quantization:A Procrustean Approach to Learning Binary Codes 这篇文章发表与2011年CVRP(Computer Vision & Pattern Recognition)&#xff0c;作者:Yunchao Go…

ITQ(Iterative Quantization)迭代量化方法详解

转载&#xff1a;http://www.yuanyong.org/cv/itq-hashing.html CVPR 2011《Iterative Quantization: A Procrustean Approach to Learning Binary Codes》论文阅读笔记。 看过的文章&#xff0c;不做记录&#xff0c;即便当时理解透了&#xff0c;过一段时间后&#xff0c;知识…

怎么查看mysql是否锁表_MySQL查看是否锁表

MySQL查看是否锁表的方法:首先进入命令窗口;然后通过执行命令“show engine innodb status\G;”查看造成死锁的sql语句,并分析索引情况即可。 可直接在mysql命令行执行:show engine innodb status\G; 查看造成死锁的sql语句,分析索引情况,然后优化sql然后show processlis…

mysql 查询 锁表_怎么查找mysql中的锁表语句?

查看sql server数据库被锁表可以用用如下语句&#xff1a; 也可以用如下语句: 拓展资料: 锁定数据库的一个表的区别SELECT * FROM table WITH (HOLDLOCK) 其他事务可以读取表&#xff0c;但不能更新删除SELECT * FROM table WITH (TABLOCKX) 其他事务不能读取表,更新和删除 SEL…

mysql中如何查看表是否被锁

https://blog.csdn.net/love666666shen/article/details/122419330 如何查看是否发生死锁 在使用mysql的时候&#xff0c;如何查看表是否被锁呢&#xff1f; 查看表被锁状态和结束死锁步骤&#xff1a; 1.在mysql命令行执行sql语句 use dbName; // 切换到具体数据库 show …

matlab画六面体,MATLAB绘制平行六面体

如果给出一个平行六面体(甚至其他多面体)的各个顶点坐标,如何画出这个平行六面体。 在网上找了找方法,可以参考这篇博客 matlab中patch函数详解。然后我具体查看了 Multifaceted Patches 帮助,记录下来以备后查。 绘制主要就是利用 patch 函数,patch 的一般调用格式为patch…

MATLAB离散点边界曲线的绘制

一大堆离散点有时候需要绘制边缘点&#xff0c;这时候可以用到boundary函数&#xff0c;这是MATLAB的自带函数&#xff0c;用机械臂的工作空间为例绘制边界曲线图&#xff1a; %建立机器人模型 % theta d a alpha offset L1Link([0 0 …

利用Matlab绘制两个点电荷电场线【物理软件课程设计】

物理软件课程设计 2021年6月的课程设计题目之一&#xff1a;设计程序&#xff0c;画出两个点电荷之间电场线分布图 入门级别&#xff0c;代码思想可能有点像C语言&#xff0c;本人应用物理学专业。 资源链接&#xff1a;(4条消息) 利用MATLAB绘制点两个电荷电场线-C文档类资…

matlab描点写函数,matlab描点并标上点的序号

使用Kinect一帧可以获取构成人脸的121个点&#xff0c;每个点对应一个序号&#xff0c;其中121个点中有20个点描绘的唇部的点&#xff0c;但我们只能看出有20个点对应嘴唇&#xff0c;并不知道这20个点的序号&#xff0c;所以需要使用matlab建模并找出这20点对应的序号。 程序如…

matlab画三维散点图,调节点大小和图案

找了老半天的三维散点图&#xff0c;都没有。后来给我摸清楚了。 你随便画个三维散点&#xff0c;用scatter3 这个函数画。注意&#xff0c;plot是二维的 plot调节大小是 markersize 这个参数&#xff0c;但是三维没有。 可以画出图形后&#xff0c;用matlab自带的图形编辑器&…

Matlab画图和点标记

从csv中导出数据&#xff0c;然后需要在MATLAB图中进行标记个别点&#xff0c;但是利用MTALB自身标记的比较丑&#xff0c;因此搜了一下别的方法&#xff0c;具体效果如下&#xff0c;其中的*可以改成O或者其他的自定义的符号&#xff1a; 具体的主要代码如下&#xff1a; fi…

matlab绘制三维点云和点云凸包

matlab绘制三维点云和点云凸包 效果展示 1.在matlab命令窗口输入guide打开matlab的ui开发界面&#xff0c;按照下图的样式绘制界面。 2. 在GUIDE中鼠标右键点击选择素材文件夹按键&#xff0c;选择查看回调&#xff1d;&#xff1e;callback编辑回调函数。 function pushbutto…

matlab 绘制孤立点

绘制孤立点 clc,clear; X[1,3,5,6]; Y[3,4,1,5]; nlength(X); hold on for i1:nplot(X(i),Y(i),c*); endresult

Matlab制作高分辨率点线图

相较于其他软件&#xff0c;MATLAB在图片制作上上手难度较高&#xff0c;但其强大的代码功能使得处理出来的图片更加漂亮。直接附代码和效果图&#xff01; x[100 125 150 175 200]; %定义x轴的坐标 sign["1#",2#,3#,4#,5#,Ave];[num,txt,raw]xlsread(D:\wudi\postg…

MATLAB 绘制点的地理空间分布,并用点的颜色或大小代表数值

%% 修改日期 2021/12/8clc clear close all%% 测试数据&#xff0c;第一列代表纬度&#xff0c;第二列经度&#xff0c;第三列则是点的值 txt [46.75296619 -69.1022775 0.31290975246.80735808 -69.06131914 0.39115348546.68438136 -68.40644856 -0.52491718547.68233472 -6…

Matlab 绘制 - 点和向量:向量加减的方法和源码

前言&#xff1a; 一些博客就是转了Matlab 的中文说明&#xff0c;可是他那个说明&#xff0c;他自己都说了不是很对。 本文从实践出发&#xff0c;详细介绍Matlab对 坐标空间的点和向量的绘制方法。 1 点的概念和画法&#xff1a; 1.1 一个平面上的点 plot(2, 3, ., MarkerS…

oracle一基础查询:单表,多表查询(交叉,内联,外联),分组聚合,子查询语法。

摘要&#xff1a;条件查询&#xff0c;别名&#xff0c;排序&#xff0c;聚合函数&#xff0c;where&#xff0c;having&#xff0c;联接查询&#xff0c;where in/exists/><子查询&#xff0c;&#xff0c;rownum伪列&#xff0c;模糊查询。 查询所有信息 select *from…

wps交叉表_使用WPS图表功能中的堆叠条形图制作日程交叉图

微软的项目&#xff0c;作为一个老式的项目管理软件&#xff0c;被许多朋友在工作中使用。它的功能相对完善&#xff0c;与微软的sharepoint服务器相结合&#xff0c;功能非常强大。一般来说&#xff0c;我们很少使用微软项目的所有功能。毕竟&#xff0c;与中国人的使用习惯还…