多视图学习利器----CCA(典型相关分析)及MATLAB实现

时间:2024-02-19 15:29:20

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。当然用处远不止于此,我们以后会继续和大家交流的。