多視圖學習利器----CCA(典型相關分析)及MATLAB實現


Hello,我是你們人見人愛花見花開的小花。又和大家見面了,今天我們來聊一聊多視圖學習利器------CCA。

一 典型相關分析的基本思想

當我們研究兩個變量x和y之間的相關關系的時候,相關系數(相關系數是用以反映變量之間相關關系密切程度的統計指標。相關系數是按積差方法計算,同樣以兩變量與各自平均值離差為基礎,通過兩個離差相乘來反映兩變量之間相關程度;着重研究線性的單相關系數)是最常用的變量:其中Sxx為標准差。

那我們如何研究兩組變量之間的相關關系呢?比如(X1,X2,X3)與(y1,y2)我們是不應該計算如下矩陣:,這樣把每一個變量之間都求出來了。但是我們這樣計算的時候是不是有點繁瑣,而且總是會忽略問題的本質。現在我們如果能找出兩組變量的各自的某個線性組合,討論線性組合之間的相關關系,那是不是更為簡潔?

現在我們利用主成分分析的思想,可以把多個變量與多個變量之間的相關轉化成兩個變量之間的相關。例如原來(X1,X2,X3)與(y1,y2)可以分別組合成兩個變量U,V.我們假設:

另外。我們找出有最大可能的相關系數(a1,a2,a3)與(b1,b2),這就是典型相關系數。也就是使

典型相關分析最朴素的思想:首先分別在每組變量中找出第一對典型變量,使其具有最大相關性,然后在每組變量中找出第二對典型變量,使其分別與本組內的第一對典型變量不相關,第二對本身具有次大的相關性。如此下去,直到進行到R步,兩組變量的相關系被提取完為止,可以得到R組變量。

二 典型相關分析的數學表達

2,1 思考

現在考慮兩組變量的向量,其協方差矩陣為其中是第一組變量的協方差矩陣,是第二組變量的協方差矩陣,為第一組和第二組共同的協方差矩陣。

2.2 典型相關系數和典型變量的求法

我就偷個懶,從我以前看的資料上截圖把計算過程給大家,哈哈。。。當然有不懂的歡迎留言問我。

計算步驟如下:

結論:既是M1又是M2的特征根,a1和b1是相應於M1和M2的特征向量。

現在我們就把典型相關分析化解成求M1和M2的特征向量和特征值問題了。這里需要說明的是第一對典型變量提取了原始變量x與y之間相關的主要成分,如果這部分還不能解釋原始變量,可以在剩余的相關中在求出第二對典型變量和他們的典型相關系數。

三 樣本典型相關系數

在實際應用中,總體的協方差矩陣常常是未知的,類似於他的統計分析方法,需要從總體中抽出一根樣本,根絕樣本對總體的協方差或者相關系數矩陣進行估計,然后利用估計得到的協方差或者相關系數矩陣進行分析。一般在圖像的特征提取時候用到,因為圖的特征太大了。

四 代碼實現

function[ccaEigvector1, ccaEigvector2] = CCA(data1, data2)

 

% Input:

% data1 ¡ª¡ª view1

% data2 ¡ª¡ª view2

% both row : a sample

% column : a feature

% Output:

% ccaEigvector1 : the projection of view1

% ccaEigvector2 : the projection of view2

% both are not unit(length) one, it makes the conical

% correlation variable has unit variance

% Reference£º

% Appearance models based on kernel canonical correlation analysis

% Pattern Recognition, 2003

% Comments:

% using SVD instead of using the eigen decomposition

 

dataLen1 = size(data1, 2);

dataLen2 = size(data2, 2);

 

% Construct the scatter of each view and the scatter between them

data = [data1 data2];

covariance = cov(data);

% Sxx = covariance(1 : dataLen1, 1 : dataLen1) + eye(dataLen1) * 10^(-7);

Sxx = covariance(1 : dataLen1, 1 : dataLen1);

% Syy = covariance(dataLen1 + 1 : size(covariance, 2), dataLen1 + 1 : size(covariance, 2)) ...

% + eye(dataLen2) * 10^(-7);

Syy = covariance(dataLen1 + 1 : size(covariance, 2), dataLen1 + 1 : size(covariance, 2));

Sxy = covariance(1 : dataLen1, dataLen1 + 1 : size(covariance, 2));

% Syx = Sxy';

 

 

 

% using SVD to compute the projection

Hx = (Sxx)^(-1/2);

Hy = (Syy)^(-1/2);

 

H = Hx * Sxy * Hy;

[U, D, V] = svd(H, 'econ');

ccaEigvector1 = Hx * U;

ccaEigvector2 = Hy * V;

% make the canonical correlation variable has unit variance

ccaEigvector1 = ccaEigvector1 * diag(diag((eye(size(ccaEigvector1, 2)) ./ sqrt(ccaEigvector1' * Sxx * ccaEigvector1))));

ccaEigvector2 = ccaEigvector2 * diag(diag((eye(size(ccaEigvector2, 2)) ./ sqrt(ccaEigvector2' * Syy * ccaEigvector2))));

 

end

五 總結

CCA主要在多視圖學習的特征融合方面有着廣泛的應用,比如兩張圖片,一張正臉,一張側臉,我們需要做一個人臉識別系統,就需要對其進行雙視圖學習,我想如果我們把這兩張圖結合在一起識別率一定會提高的,我們就需要用到CCA。當然用處遠不止於此,我們以后會繼續和大家交流的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM