一、文章簡介html
名稱:Iterative Quantization:A Procrustean Approach to Learning Binary Codesgit
這篇文章發表與2011年CVRP(Computer Vision & Pattern Recognition),做者:Yunchao Gonggithub
這篇文章的主要思路是先對原始空間的數據集 用PCA進行降維處理,設通過PCA降維後的數據集爲 ,該問題就能夠轉化爲將該數據集中的數據點映射到一個二進制超立方體的頂點上,使得對應的量化偏差最小,從而而已獲得對應該數據集優良的二進制編碼。數據庫
二、論文介紹數據結構
Related works:dom
一、Approximate Nearest Neighbor Search優化
方法整體上來講有O(logn)O(logn)和O(n)O(n)兩種複雜度。第一種複雜度專一於一些數據結構,好比樹;第二種是讓暴力方法更加高效。第一種的例子是kd-tree,第二種是LSH。編碼
二、Similarity Preserving Binary Codesspa
類似度保存的二值編碼,主要有一下三步:
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.(類似度計算).net
主要思路:先對原始空間的數據集X∈Rn∗dX∈Rn∗d用PCA進行降維處理,設通過PCA降維後的數據集爲V∈Rn∗cV∈Rn∗c,該問題就能夠轉化爲將該數據集中的數據點映射到一個二進制超立方體的頂點上,使得對應的量化偏差最小,從而獲得對應該數據集優良的二進制編碼。
設v∈Rcv∈Rc爲原特徵空間中某一數據點通過PCA降維後的表示形式,對應在超立方體中的頂點用sgn(v)∈{−1,1}c來表示,要使量化偏差最小,即v∈Rc與sgn(v)∈{−1,1}c的歐式距離最小,即min||sgn(v)−v)||2,對於全部的數據點進行二進制編碼後用B表示,PCA降維後V=X∗W,對整個數據集爲min||B−V||2 。因爲對矩陣進行旋轉能夠下降量化偏差,以下圖示:
從圖1能夠看出,對投影后的矩陣V進行隨機旋轉後,量化偏差下降至0.93,對於找到的最優的旋轉矩陣,量化偏差下降至0.88(矩陣與正交矩陣相乘實際上就是對矩陣作旋轉)。基於這樣一個事實,考慮將投影后的數據集V進行旋轉變換,min||B−V||^2便變換爲min||B−VR||^2,R∈R^c∗c爲旋轉矩陣,正交。整個問題域就變成了min||B−VR||^2的優化問題,即找出最優的旋轉矩陣R和與之對應的編碼B。
該式的優化能夠採用交替迭代的求解方法:先生成隨機矩陣並對其進行SVD分解獲得對應的正交矩陣做爲R的初始值,而後固定R求B, B=sgn(V×D)(注意這裏截距 b=0 ,由於在原空間已對數據中心化,很是重要),B求出來再經過對 B×V進行SVD更新R,交替迭代若干次便可,文中選用的是50次。
經過上面過程即可通過PCA降維後的數據完成編碼過程,後面的類似性採用漢明距離進行度量,這裏不贅述。
總結一下,整個過程能夠歸納爲:先對數據集進行PCA降維,而後尋找量化偏差最小的旋轉矩陣便可獲得對應該最優旋轉矩陣下的特徵向量的二進制編碼。
四、詳細介紹:
二值量化
假設第二步求得降維矩陣維W,而後將數據映射到了空間中的一個一個點,如今就是要將空間中的點映射到一個邊長爲1的超立方體中,以原點爲空心,方方正正的放在空間中的超立方體是二值碼的(爲方面記這個超立方體爲Q0)。但若是咱們對數據進行一個旋轉再映射到這個空間中,會獲得更小的量化偏差。這個想法相似於若是咱們只是要將數據映射到邊長爲1的立方體中,而不須要固定超立方體的具體位置,這就等同於對數據進行旋轉,再映射到以Q0。
降維後的數據:V=XW,旋轉後的數據:VR (R是旋轉矩陣,必須是c*c維的正交矩陣)最小化映射偏差:
等價於
問題等價於最大化:
可是這裏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至關簡單。最大化
由於這裏B的元素只有1和-1(由於是二值碼,做者用-1表示0,這樣只是爲了求解問題簡單),因此
B =sgn(V R)。
(2) 固定B,求解R
這是一個線性代數的問題orthogonal Procrustes problem。這個爲題的原型是對A作一個正交投影,於B儘可能類似:
因此本文中,
文章迭代求解50步,便可獲得最後二值碼的編碼方式。
求得B,R以後,總體的編碼方式是:
BincodeXtrainingITQ =compactbit(bsxfun(@minus, Xtraining, sample_mean) * eigVec * R > 0);
Matlab源代碼:Yunchao Gong Homepage上公開了源碼,不過並未提供數據庫,直接運行不了,我已經對源碼進行了modify,有須要的能夠看LSH、ITQ、SKLSH圖像檢索實驗實現(Code)這篇文章,在這篇文章中提供了modified後的代碼,也能夠直接到 Github: https://github.com/willard-yuan/ITQ_ImageRetrieval 主頁上下載modified後的代碼。
Matlab源代碼:Yunchao Gong Homepage上公開源代碼:
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;
PCA-ITQ檢索實例實驗主要代碼:
見博文 [3]
第1幅是查詢圖像,後面129是從59k的database裏檢索出來的類似的圖像。
引用:
[1]. Yunchao Gong and S. Lazebnik. Iterative Quantization: A Procrustean Approach to Learning Binary Codes. In: IEEE International Conference on Computer Vision and Pattern Recognition (CVPR), 2011
[2].參考博客:https://blog.csdn.net/le_le_name/article/details/51615915?locationNum=2
[3].推薦博客:https://www.cnblogs.com/keanuyaoo/p/3331267.html