ITQ算法理解

IterativeQuantization: A Procrustean Approach to Learning Binary Codes 論文理解及代碼講解算法

這篇文章發表在2011年CVRP上,一做是Yunchao Gong,師從Sanjiv Kumar,關於Sanjiv Kumar能夠到她的HomePage上了解。函數

文章目的:學習保留類似度的二值碼,以用於高效的在大規模數據集中作圖像檢索。本文介紹了在無監督的數據集中用PCA來學習ITQ,在有監督的數據集中用CCA來學習ITQ。學習

首先介紹學習二值碼的重要性:優化

計算機視覺愈來愈重視學習類似性保存的二進制代碼來表明大規模的圖像集合。它主要有三個優勢:編碼

(1)     用短的二值碼來代圖像,能夠在內存中存儲大量的圖像。spa

(2)     比較兩幅圖像類似性,用二值碼來計算hamming距離,很是快速,高校。.net

(3)     用這個方法能夠代替大規模圖像索引方法。code

學習二值碼有三個重要的特性:索引

(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維的正交矩陣)

最小化映射偏差:

 

等價於:

 

 

問題等價於最大化:

 

 

 

可是這裏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步,便可獲得最後二值碼的編碼方式。

 % 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的相關性最大。

 

 

 

 

在本文中,做者使用

 

 

若是咱們獲得了W,就不用獲得U,應爲咱們獲得W的做用是對數據進行降維,而U在之後的ITQ過程當中是無用的。

 

獲得降維矩陣後,其他操做和前面相同。

 

參考:https://www.jianshu.com/p/4cd4bc82229a

相關文章
相關標籤/搜索