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