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。當然用處遠不止於此,我們以后會繼續和大家交流的。
