笔记:ITQ

  • Introduction
  • Related Works
    • Approximate Nearest Neighbor Search
    • Similarity Preserving Binary Codes
  • ITQ
  • 代码

Introduction

large-scale image retrieval的主要挑战:
1. define similarity between images(图片间相似度定义-cv的基础问题)
2. design compact representation for images so we can store them(设计图片的紧凑表达,高效存储)
3. design fast search schemes so we can efficiently find similar images(设计高效搜索方法)

LSH:Locality-sensitive hashing. high-dimensional vectors -> discrete representation. Based on: random projections to perform spatial partitioning.

扩展阅读: 1. boosting. 2. restricted Boltzmann machines.

Related Works

方法总体上来说有 O(logn) O(n) 两种复杂度。第一种复杂度专注于一些数据结构,比如树;第二种是让暴力方法更加高效。第一种的例子是kd-tree,第二种是LSH。

Similarity Preserving Binary Codes

相似度保存的二值编码,主要有一下三步:
1. Projection learning, or finding a linear or nonlinear projection of the data;(映射数据)
2. Binary thresholding, or quantizing continuous projected data to binary vectors;(量化映射后的数据到二值向量)
3. Similarity computation, or finding distances between query and database points.(相似度计算)

ITQ

主要思路:先对原始空间的数据集 XRnd 用PCA进行降维处理,设经过PCA降维后的数据集为 VRnc ,该问题就可以转化为将该数据集中的数据点映射到一个二进制超立方体的顶点上,使得对应的量化误差最小,从而得到对应该数据集优良的二进制编码。

vRc 为原特征空间中某一数据点经过PCA降维后的表示形式,对应在超立方体中的顶点用 sgn(v){1,1}c 来表示,要使量化误差最小,即 vRc sgn(v){1,1}c 的欧式距离最小,即 min||sgn(v)v)||2 ,对于所有的数据点进行二进制编码后用 B 表示,PCA降维后 V=XW ,对整个数据集为 min||BV||2 。由于对矩阵进行旋转可以降低量化误差,如下图示:
这里写图片描述
从图1可以看出,对投影后的矩阵V进行随机旋转后,量化误差降低至0.93,对于找到的最优的旋转矩阵,量化误差降低至0.88(矩阵与正交矩阵相乘实际上就是对矩阵做旋转)。基于这样一个事实,考虑将投影后的数据集 V 进行旋转变换, min||BV||2 便变换为 min||BVR||2 RRcc 为旋转矩阵,正交。整个问题域就变成了 min||BVR||2 的优化问题,即找出最优的旋转矩阵 R 和与之对应的编码 B
该式的优化可以采用交替迭代的求解方法:先生成随机矩阵并对其进行SVD分解得到对应的正交矩阵作为 R 的初始值,然后固定 R B B=sgn(V×D) (注意这里截距 b=0 ,因为在原空间已对数据中心化,非常重要), B 求出来再通过对 B×V 进行SVD更新R,交替迭代若干次即可,文中选用的是50次。
总结一下,整个过程可以概括为:先对数据集进行PCA降维,然后寻找量化误差最小的旋转矩阵即可得到对应该最优旋转矩阵下的特征向量的二进制编码。

代码

function ITQparam = trainITQ(X, ITQparam)
% Input:
%       X: n * d, n is the number of images
%       ITQparam:
%                 ITQparam.pcaW---PCA of all the database
%                 ITQparam.nbits---encoding length
%
% Output:
%        ITQparam:
%                 ITQparam.pcaW---PCA of all the database
%                 ITQparam.nbits---encoding length
%                 ITQparam.r---ITQ rotation projection

pc = ITQparam.pcaW;     % W
nbits = ITQparam.nbits; % c

V = X * pc;             % V

% initialize with a orthogonal random rotation
R = randn(nbits, nbits);

% R-orthogonal
[U11 S2 V2] = svd(R);
R = U11(:, 1: nbits);

% ITQ to find optimal rotation
for iter = 0 : 50
    Z = V * R;
    % calculate B = UX
    UX = ones(size(Z, 1), size(Z, 2)) .* -1;
    UX(Z >= 0) = 1;

    % B' * V
    C = UX' * V;
    [UB, sigma, UA] = svd(C);
    R = UA * UB';
    %fprintf('iteration %d has finished\r',iter);
end

% make B binary
%B = UX;
%B(B<0) = 0;

ITQparam.r = R;

你可能感兴趣的:(Hash)