典型相关分析(C C A)附算法应用及程序典型相关分析摘要利用典型相关分析的思想,提出了解决了当两组特征矢量构成的总体协方差矩阵奇异时,典型投影矢量集的求解问题,使之适合于高维小样本的情形,推广了典型相关分析的适用范围.首先,探讨了将典型分析用于模式识别的理论构架,给出了其合理的描述.即先抽取同一模式的两组特征矢量,建立描述两组特征矢量之间相关性的判据准则函数,然后依此准则求取两组典型投影矢量集,通过给定的特征融合策略抽取组合的典型相关特征并用于分类.最后,从理论上进一步剖析了该方法之所以能有效地用于识别的内在本质.该方法巧妙地将两组特征矢量之间的相关性特征作为有效判别信息,既达到了信息融合之目的,又消除了特征之间的信息冗余,为两组特征融合用于分类识别提出了新的思路.一、典型相关分析发展的背景随着计算机技术的发展,信息融合技术已成为一种新兴的数据处理技术,并已取得了可喜的进展.信息融合的3个层次像素级、特征级、决策级。
特征融合,对同一模式所抽取的不同特征矢量总是反映模式的不同特征的有效鉴别信息,抽取同一模式的两组特征矢量,这在一定程度上消除了由于主客观因素带来的冗余信息,对分类识别无疑具有重要的意义典型相关分析(CanoniealComponentAnalysis:CCA)是一种处理两组随机变量之间相互关系的统计方法。
它的意义在于:用典型相关变量之间的关系来刻画原来两组变量之间的关系!实现数据的融合和降维!降低计算复杂程度。
二、典型相关分析的基本思像CCA 的目的是寻找两组投影方向,使两个随机向量投影后的相关性达到最大。
具体讲,设有两组零均值随机变量 ()Tc ...c c p 21x ,,=和()Td ...d d q 21y ,,=CCA 首先要找到一对投影方向1α和1β,使得投影y v 11Tβ= 和x u 11Tα=之间具有最大的相关性,1u 和1v 为第一对典型变量;同 理,寻找第二对投影方向2α和2β,得到第二对典型变量2u 和2v ,使其与第一对典型变量不相关,且2u 和2v 之间又具有最大相关性。
这样下去,直到x 与y 的典型变量提取完毕为止。
从而x 与y 之间的相关性分析,只需通过分析少数几对典型变量的关系即可达到目的。
三、CCA 算法详解考虑到:的极值只与α和β的方向有关,而与它们的大小无关,为了得到唯一解不失一般性,加入限制条件:1xx =ββ=ααyy T T S S问题变为在约束条件式下,求使准则函数式取最大值的典型投影矢量对 α和β求解上述优化问题,可定义拉格朗日函数:分别对α和β求导数,并令为零,得到:(1)(2)(3)(4)(5) (6)对H 进行奇异值分解:分别将x T 1α,x T 2α ,…x T d α 与 x T 1β,x T2β ,…x T d β看做是变换后的特征分量:(7)再对上式两端分别左乘 和 得:记为:T αTβρ=λ=λ21TUSV H =i i T u HH 2u λ=ii T v H H 2v λ=⎪⎩⎪⎨⎧=β=α--i yy i i xx i v S u S 2121令(8)(9)(10) (11) (12)(13)(14) (15)投影后的组合特征用于分类,其中变换矩阵为:四、典型相关分析应用实例欲研究儿童形态与肺通气功能的关系,测得某小学40名8~12岁健康儿童(身高X1,体重X2,胸围X3)与肺通气功能(肺活量Y1,静息通气Y2和每分钟最大通气量Y3),分析儿童形态和肺通气指标的相关性,确定典型变量的对数。
x1 =[140.6,135.7,140.2,152.1,132.2,147.1,147.5,130.6,154.9,142.4,136.5,162, 148.9,136.3,159.5,165.9,134.5,152.5,138.2,144.2];x2 =[43.7,39.5,48,52,36,45,47,38,48,42,38,58,42,33,49,55,41,53,35.5,42];x3 =[77,63,75,88,62,78,76,61,87,74,69,95,80,68,87,93,61,83,66,76];y1 =[2.6,2,2.6,2.8,2.1,2.8,3.1,2,2.9,2.33,1.98,3.29,2.7,2.4,2.98,3.1,2.25,2.96, 2.13,2.52];y2 =[7,7,6.1,10.1,7.4,9.25,8.78,5.31,10.6,11.1,7.77,3.35,10.1,7.8,11.77,13.14, 8.75,6.6,6.62,5.59];y3 =[108,91,101,112,97,92,95,77,80,76,49,58,82,76,88,110,75,71,105,82];(1)仿真结果分析结:(实验平台:Matlab2014,程序见附录)R1=0.9282R2=0.5302R3=0.0081(16)(17)R1=0.9282R2==0.5302R3=0.0081(2)结果分析:三幅分别对应不同特征值所对应的儿童形态与肺通气功能的关系,显然,第一幅图的线性关系最好,即儿童形态与肺通气功能的相关性最大,变化趋势一致,进行特征融合以达到降维的目的。
六、心得体会通过本次大作业,对小样的典型相关分析查阅了很多文献,对文献的阅读的辨别能力有了很大提升,抓住文献中的重点要点,进行深一步的理解;其次在程序的编写中,CCA的编写从原理到算法解析再到算法的逻辑结构,一步步的将CCA的思想理解透彻并体现在MATLAB的程序中,在程序编写的过程中也遇到了很多挫折和编译失败的困惑,但是通过网上查阅和向教员请教以及同学的询问,一一得到解决,最终完成了本次大作业的撰写,其中也收获到了很多东西,学到了很多,希望以后能扎实学习,更进一步。
附录:clear allclcx1=[140.6,135.7,140.2,152.1,132.2,147.1,147.5,130.6,154.9,142.4,136.5 ,162,148.9,136.3,159.5,165.9,134.5,152.5,138.2,144.2];x2=[43.7,39.5,48,52,36,45,47,38,48,42,38,58,42,33,49,55,41,53,35.5,42 ];x3=[77,63,75,88,62,78,76,61,87,74,69,95,80,68,87,93,61,83,66,76];y1=[2.6,2,2.6,2.8,2.1,2.8,3.1,2,2.9,2.33,1.98,3.29,2.7,2.4,2.98,3.1,2 .25,2.96,2.13,2.52];y2=[7,7,6.1,10.1,7.4,9.25,8.78,5.31,10.6,11.1,7.77,3.35,10.1,7.8,11.7 7,13.14,8.75,6.6,6.62,5.59];y3=[108,91,101,112,97,92,95,77,80,76,49,58,82,76,88,110,75,71,105,82]; mx1=sum(x1)/20;mx2=sum(x2)/20;mx3=sum(x3)/20;my1=sum(y1)/20;my2=sum(y2)/20;my3=sum(y3)/20;d=[1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1];x1=x1-mx1.*d;x2=x2-mx2.*d;x3=x3-mx3.*d;y1=y1-my1.*d;y2=y2-my2.*d;y3=y3-my3.*d;%b=imread('1.jpg');%a=imread('2.jpg');%c=rgb2gray(a);%d=rgb2gray(b);%c=double(imresize(c,[128,128]));%d=double(imresize(d,[128,128]));%zushu = size(X,1);A=[x1',x2',x3'];B=[y1',y2',y3'];[Wx, Wy, r,n,m] = CCA_algorithm(A,B);%CCA_zq.(Z,zushu,2)Z=WxY=WyU1=Wx(:,1);U2=Wx(:,2);U3=Wx(:,3);V1=Wy(:,1);V2=Wy(:,2);V3=Wy(:,3);figure(1);plot(U1,V1,'*');figure(2);plot(U2,V2,'r*');figure(3);plot(U2,V2,'g^')%CCA函数调用:function [U,V,nmuta,nmutatwo,U_replace,V_replace]=CCA_algorithm(X,Y) %计算典型相关分析的程序n=size(X,1);p=size(X,2);q=size(Y,2);X=X-repmat(mean(X,1),n,1);Y=Y-repmat(mean(Y,1),n,1);Z=[X Y];Covz=cov(Z);S11=Covz(1:p,1:p);S22=Covz(p+1:end,p+1:end);S12=Covz(1:p,p+1:end);%S21=Covz(p+1:end,1:p);S21=S12';k=1;Ip=eye(p);Iq=eye(q);if rank(S11)~=pS11=S11+k*Ip;endif rank(S22)~=qS22=S22+k*Iq;end%避免出现复数,不使用S11^(-1/2)K=S11^(-1/2)*S12*S22^(-1/2);d=rank(K);[U1,S1,V1]=svd(K,0);U2=U1(:,1:d);V2=V1(:,1:d);A=S11^(-1/2)*U2;B=S22^(-1/2)*V2;%A=S11^(1/2)\U2;%B=S22^(1/2)\V2;U=X*A;V=Y*B;nmuta=diag(S1);nmuta=nmuta(1:d);%使用下面的效果是一样的M1=inv(S11)*S12*inv(S22)*S21;M2=inv(S22)*S21*inv(S11)*S12;[V1,D1]=eig(M1);[V2,D2]=eig(M2);%归一化gu1=V1'*S11*V1;gu1=1./sqrt(diag(gu1));gu1=repmat(gu1',p,1);a=V1.*gu1;gu2=V2'*S22*V2;gu2=1./sqrt(diag(gu2));gu2=repmat(gu2',q,1);b=V2.*gu2;d1=size(find(diag(D1)~=0),1);%对特征值自动排序的,由大到小%d1=min(max(diag(D1),0),1); d2=size(find(diag(D2)~=0),1);dd=min(d1,d2);Utwo=a(:,1:dd);Vtwo=b(:,1:dd);nmutatwo=sqrt(diag(D1));%已经取过平方根了nmutatwo=nmutatwo(1:dd);A1=Utwo;B1=Vtwo;U_replace=X*A1;V_replace=Y*B1;end。