《Aggregating local descriptors into a compact image representation》論文筆記
在論文中,提取到VLAD特徵後,要對特徵向量進行PCA降維,就是用一個大小爲D’ * D的矩陣M,對VLAD特徵向量x做變換,降維後的vector是x’ = Mx,x’的大小是D’維。矩陣M是由原樣本的協方差矩陣的D’個特徵向量構成。
爲什麼M要是特徵向量的矩陣呢?
根據PRML中的內容,理解如下:
1,Maxinum Variance Formulation
PCA的一種定義就是要使降維後的特徵點的方差儘可能大。
考慮如上圖中二維的一組特徵點x,現在要對它們降到1維,圖中
特徵點均值:
映射後特徵點方差(variance):
其中S是原特徵點集的協方差矩陣:
我們的目標就是求一個
用拉格朗日乘數法求解,寫出拉格朗日函數:
對
可以看出,
所以PCA方法中用來做變換的矩陣M是這樣構成的:將原特徵點集的協方差矩陣的特徵值從大到小排列,取前D’個,把它們對應的特徵向量取出來組成M,M的第1行就是
降維後原特徵點必然會損失一些信息,我們把降維後的x’再映射回去,得到
2,Minimum-error formulation
PCA的另一種定義是最小誤差,也就是特徵點在映射過程中的損失最小,使映射後的樣本和映射前儘可能近似,反映在上文的圖中就是要使藍色的線段最短。
這樣我們就可以得到一個新的優化問題,這個優化問題的解與最大方差得到的解是一致的。詳細可見《Pattern Recognition and Machine Learning》。
論文中對傳統的PCA方法做了改進。
比如,全特徵點集的協方差矩陣的特徵值從大到小排列爲
可以看到,在X’的前幾行,是用較大的特徵值對應的特徵向量映射的,那麼這一部分數據方差較大,而到下面幾行,方差會越來越小,這樣會導致在建立ADC索引時,對於X’上面幾行的方差較大的子向量(subvector),索引編碼會更粗糙一些(因爲在ADC中對於每組subvector都是產生固定的k個聚類中心來作爲codebook),這樣就容易損失數據信息,影響搜索精度,所以需要balance方差。
於是論文中引入一個Q,得到如下優化問題:
那麼由PCA降維後的特徵點集就是
而這個優化問題難以直接求解,文中提到兩種方法:
1,令矩陣Q爲Householder矩陣,則Q可以分解:
2,爲矩陣Q隨機賦值,論文中提到,這樣的Q在實驗中的結果還可以。
3,PCA代碼
function [Y, E, mu] = pca_(X)
%[Y,V,E,D] = pca_(X)
% do PCA on image patches
%
% INPUT variables:
% X matrix with image patches as columns
%
% OUTPUT variables:
% Y the project matrix of the input data X without whiting
% V whitening matrix
% E principal component transformation (orthogonal)
% D variances of the principal components
%去除直流成分
mu = mean(X, 2);
X = X-repmat(mean(X, 2), 1, size(X, 2));
% Calculate the eigenvalues and eigenvectors of the new covariance matrix.
covarianceMatrix = X*X'/(size(X,2)-1); %求出其協方差矩陣
%E是特徵向量構成,它的每一列是特徵向量,D是特徵值構成的對角矩陣
%這些特徵值和特徵向量都沒有經過排序
[E, D] = eig(covarianceMatrix);
% Sort the eigenvalues and recompute matrices
% 因爲sort函數是升序排列,而需要的是降序排列,所以先取負號,diag(a)是取出a的對角元素構成
% 一個列向量,這裏的dummy是降序排列後的向量,order是其排列順序
[~,order] = sort(diag(-D));
E = E(:,order);%將特徵向量按照特徵值大小進行降序排列,每一列是一個特徵向量
Y = E'*X;
d = diag(D); %d是一個列向量
%dsqrtinv是列向量,特徵值開根號後取倒,仍然是與特徵值有關的列向量
%其實就是求開根號後的逆矩陣
dsqrtinv = real(d.^(-0.5));
Dsqrtinv = diag(dsqrtinv(order));%是一個對角矩陣,矩陣中的元素時按降序排列好了的特徵值(經過取根號倒後)
D = d(order);%D是一個對角矩陣,其對角元素由特徵值從大到小構成
V = Dsqrtinv*E';%特徵值矩陣乘以特徵向量矩陣
E = E'; % 每一行爲一個特徵向量,降序排列