典型关联分析(CCA)原理总结

我只是一名搬运工,以下内容来自:刘建平Pinard https://www.cnblogs.com/pinard/p/6288716.html


1. 前言

  典型关联分析(Canonical Correlation Analysis,以下简称CCA)是最常用的挖掘数据关联关系的算法之一。比如我们拿到两组数据,第一组是人身高和体重的数据,第二组是对应的跑步能力和跳远能力的数据。那么我们能不能说这两组数据是相关的呢?CCA可以帮助我们分析这个问题。

2. CCA概述

  在数理统计里面,我们都知道相关系数这个概念。假设有两组一维的数据集X和Y,则相关系数 ρ \rho ρ的定义为:
ρ ( X , Y ) = c o v ( X , Y ) D ( X ) D ( Y ) \rho(X,Y) = \frac{cov(X,Y)}{\sqrt{D(X)}\sqrt{D(Y)}} ρ(X,Y)=D(X) D(Y) cov(X,Y)

其中 c o v ( X , Y ) cov(X,Y) cov(X,Y)是X和Y的协方差,而 D ( X ) , D ( Y ) D(X), D(Y) D(X),D(Y)分别是X和Y的方差。相关系数 ρ \rho ρ的取值为[-1,1],  ρ \rho ρ的绝对值越接近于1,则X和Y的线性相关性越高。越接近于0,则X和Y的线性相关性越低。

  虽然相关系数可以很好的帮我们分析一维数据的相关性,但是对于高维数据就不能直接使用了。拿上面我们提到的,如果X是包括人身高和体重两个维度的数据,而Y是包括跑步能力和跳远能力两个维度的数据,就不能直接使用相关系数的方法。那我们能不能变通一下呢?CCA给了我们变通的方法。

  CCA使用的方法是将多维的X和Y都用线性变换为1维的X’和Y’,然后再使用相关系数来看X’和Y’的相关性。将数据从多维变到1位,也可以理解为CCA是在进行降维,将高维数据降到1维,然后再用相关系数进行相关性的分析。下面我们看看CCA的算法思想。

3. CCA的算法思想

  上面我们提到CCA是将高维的两组数据分别降维到1维,然后用相关系数分析相关性。但是有一个问题是,降维的标准是如何选择的呢?回想下主成分分析PCA,降维的原则是投影方差最大;再回想下线性判别分析LDA,降维的原则是同类的投影方差小,异类间的投影方差大。对于我们的CCA,它选择的投影标准是降维到1维后,两组数据的相关系数最大。

  现在我们具体来讨论下CCA的算法思想。假设我们的数据集是X和Y,X为 n 1 × m n_1 \times m n1×m的样本矩阵。Y为 n 2 × m n_2 \times m n2×m的样本矩阵.其中m为样本个数,而 n 1 , n 2 n_1,n_2 n1,n2分别为X和Y的特征维度。

  对于X矩阵,我们将其投影到1维,或者说进行线性表示,对应的投影向量或者说线性系数向量为 a a a, 对于Y矩阵,我们将其投影到1维,或者说进行线性表示,对应的投影向量或者说线性系数向量为 b b b, 这样X ,Y投影后得到的一维向量分别为X’,Y’。我们有
X ′ = a T X , Y ′ = b T Y X' = a^TX, Y'=b^TY X=aTX,Y=bTY

  我们CCA的优化目标是最大化 ρ ( X ′ , Y ′ ) \rho(X',Y') ρ(X,Y)得到对应的投影向量 a , b a,b a,b,即 a r g    m a x ⎵ a , b c o v ( X ′ , Y ′ ) D ( X ′ ) D ( Y ′ ) \underbrace{arg\;max}_{a,b}\frac{cov(X',Y')}{\sqrt{D(X')}\sqrt{D(Y')}} a,b argmaxD(X) D(Y) cov(X,Y)

  在投影前,我们一般会把原始数据进行标准化,得到均值为0而方差为1的数据X和Y。这样我们有:
c o v ( X ′ , Y ′ ) = c o v ( a T X , b T Y ) = E ( &lt; a T X , b T Y &gt; ) = E ( ( a T X ) ( b T Y ) T ) = a T E ( X Y T ) b cov(X&#x27;,Y&#x27;) = cov(a^TX, b^TY) = E(\lt a^TX, b^TY\gt) \\ \qquad \qquad = E((a^TX)(b^TY)^T) = a^TE(XY^T)b cov(X,Y)=cov(aTX,bTY)=E(<aTX,bTY>)=E((aTX)(bTY)T)=aTE(XYT)b

D ( X ′ ) = D ( a T X ) = a T E ( X X T ) a D ( Y ′ ) = D ( b T Y ) = b T E ( Y Y T ) b D(X&#x27;) = D(a^TX) = a^TE(XX^T)a \\ D(Y&#x27;) =D(b^TY) = b^TE(YY^T)b D(X)=D(aTX)=aTE(XXT)aD(Y)=D(bTY)=bTE(YYT)b

  由于我们的X,Y的均值均为0,则
D ( X ) = c o v ( X , X ) = E ( X X T ) , D ( Y ) = c o v ( Y , Y ) = E ( Y Y T ) c o v ( X , Y ) = E ( X Y T ) , c o v ( Y , X ) = E ( Y X T ) D(X) = cov(X,X) = E(XX^T), D(Y)= cov(Y,Y) = E(YY^T) \\ cov(X,Y) = E(XY^T), cov(Y,X) = E(YX^T) D(X)=cov(X,X)=E(XXT),D(Y)=cov(Y,Y)=E(YYT)cov(X,Y)=E(XYT),cov(Y,X)=E(YXT)

  令 S X Y = c o v ( X , Y ) S_{XY} =cov(X,Y) SXY=cov(X,Y),则优化目标可以转化为:
a r g &ThickSpace; m a x ⎵ a , b a T S X Y b a T S X X a b T S Y Y b \underbrace{arg\;max}_{a,b}\frac{a^TS_{XY}b}{\sqrt{a^TS_{XX}a}\sqrt{b^TS_{YY}b}} a,b argmaxaTSXXa bTSYYb aTSXYb

  由于分子分母增大相同的倍数,优化目标结果不变,我们可以采用和SVM类似的优化方法,固定分母,优化分子,具体的转化为:
a r g &ThickSpace; m a x ⎵ a , b &ThickSpace;&ThickSpace; a T S X Y b s . t . a T S X X a = 1 , &ThickSpace; b T S Y Y b = 1 \underbrace{arg\;max}_{a,b}\;\;{a^TS_{XY}b} \\ s.t. a^TS_{XX}a =1,\; b^TS_{YY}b =1 a,b argmaxaTSXYbs.t.aTSXXa=1,bTSYYb=1

  也就是说,我们的CCA算法的目标最终转化为一个凸优化过程,只要我们求出了这个优化目标的最大值,就是我们前面提到的多维X和Y的相关性度量,而对应的 a , b a,b a,b则为降维时的投影向量,或者说线性系数。

  这个函数优化一般有两种方法,第一种是奇异值分解SVD,第二种是特征分解,两者得到的结果一样,下面我们分别讲解。

4. CCA算法的SVD求解

  对于上面的优化目标,我们可以做一次矩阵标准化,就可以用SVD来求解了。

  首先,我们令 a = S X X − 1 / 2 u , b = S Y Y − 1 / 2 v a=S_{XX}^{-1/2}u, b=S_{YY}^{-1/2}v a=SXX1/2u,b=SYY1/2v,这样我们有: a T S X X a = 1 ⇒ u T S X X − 1 / 2 S X X S X X − 1 / 2 u = 1 ⇒ u T u = 1 a^TS_{XX}a =1 \Rightarrow u^TS_{XX}^{-1/2}S_{XX}S_{XX}^{-1/2}u =1\Rightarrow u^Tu=1 aTSXXa=1uTSXX1/2SXXSXX1/2u=1uTu=1

b T S Y Y b = 1 ⇒ v T S Y Y − 1 / 2 S Y Y S Y Y − 1 / 2 v = 1 ⇒ v T v = 1 b^TS_{YY}b =1 \Rightarrow v^TS_{YY}^{-1/2}S_{YY}S_{YY}^{-1/2}v=1 \Rightarrow v^Tv=1 bTSYYb=1vTSYY1/2SYYSYY1/2v=1vTv=1

a T S X Y b = u T S X X − 1 / 2 S X Y S Y Y − 1 / 2 v a^TS_{XY}b = u^TS_{XX}^{-1/2}S_{XY}S_{YY}^{-1/2}v aTSXYb=uTSXX1/2SXYSYY1/2v

  也就是说,我们的优化目标变成下式: a r g &ThickSpace; m a x ⎵ u , v u T S X X − 1 / 2 S X Y S Y Y − 1 / 2 v s . t . u T u = 1 , &ThickSpace; v T v = 1 \underbrace{arg\;max}_{u,v}u^TS_{XX}^{-1/2}S_{XY}S_{YY}^{-1/2}v \\ s.t. u^Tu =1,\; v^Tv =1 u,v argmaxuTSXX1/2SXYSYY1/2vs.t.uTu=1,vTv=1
   
  仔细一看,如果将u和v看做矩阵 M = S X X − 1 / 2 S X Y S Y Y − 1 / 2 M=S_{XX}^{-1/2}S_{XY}S_{YY}^{-1/2} M=SXX1/2SXYSYY1/2的某一个奇异值对应的左右奇异向量。那么利用奇异值分解,我们可以得到 M = U Σ V T M=U\Sigma V^T M=UΣVT, 其中 U , V U,V U,V分别为M的左奇异向量和右奇异向量组成的矩阵,而 Σ \Sigma Σ为M的奇异值组成的对角矩阵。由于 U , V U,V U,V所有的列都为标准正交基,则 u T U u^TU uTU V T v V^Tv VTv得到一个只有一个标量值为1,其余标量值为0的向量。此时我们有
u T S X X − 1 / 2 S X Y S Y Y − 1 / 2 v = u T U Σ V T v = σ u v u^TS_{XX}^{-1/2}S_{XY}S_{YY}^{-1/2}v = u^TU\Sigma V^Tv = \sigma_{uv} uTSXX1/2SXYSYY1/2v=uTUΣVTv=σuv

  也就是说我们最大化 u T S X X − 1 / 2 S X Y S Y Y − 1 / 2 v u^TS_{XX}^{-1/2}S_{XY}S_{YY}^{-1/2}v uTSXX1/2SXYSYY1/2v, 其实对应的最大值就是某一组左右奇异向量所对应的奇异值的最大值。也就是将M做了奇异值分解后,最大的奇异值就是我们优化目标的最大值,或者说我们的X和Y之间的最大相关系数。利用对应的左右奇异向量 u , v u,v u,v我们也可以求出我们原始的X和Y的线性系数 a = S X X − 1 / 2 u , b = S Y Y − 1 / 2 v a=S_{XX}^{-1/2}u, b=S_{YY}^{-1/2}v a=SXX1/2u,b=SYY1/2v

  可以看出,SVD的求解方式非常简洁方便。但是如果你不熟悉SVD的话,我们也可以用传统的拉格朗日函数加上特征分解来完成这个函数的优化。

5. CCA算法的特征分解求解

  特征分解方式就比较传统了,利用拉格朗日函数,优化目标转化为最大化下式:
J ( a , b ) = a T S X Y b − λ 2 ( a T S X X a − 1 ) − θ 2 ( b T S Y Y b − 1 ) J(a,b) = a^TS_{XY}b -\frac{\lambda}{2}(a^TS_{XX}a-1)-\frac{\theta}{2}(b^TS_{YY}b-1) J(a,b)=aTSXYb2λ(aTSXXa1)2θ(bTSYYb1)

  分别对 a , b a,b a,b求导并令结果为0,我们得到:
S X Y b − λ S X X a = 0 S Y X a − θ S Y Y b = 0 S_{XY}b-\lambda S_{XX}a=0 \\ S_{YX}a-\theta S_{YY}b=0 SXYbλSXXa=0SYXaθSYYb=0

  将上面第一个式子左乘 a T a^T aT,第二个式子左乘 b T b^T bT,并利用 a T S X X a = 1 , &ThickSpace; b T S Y Y b = 1 a^TS_{XX}a =1,\; b^TS_{YY}b =1 aTSXXa=1,bTSYYb=1,我们得到
λ = θ = a T S X Y b \lambda = \theta = a^TS_{XY}b λ=θ=aTSXYb

  其实也就是说我们的拉格朗日系数就是我们要优化的目标。我们继续将上面的两个式子做整理,第一个式子左乘 S X X − 1 S_{XX}^{-1} SXX1,第二个式子左乘 S Y Y − 1 S_{YY}^{-1} SYY1,我们得到:
S X X − 1 S X Y b = λ a S Y Y − 1 S Y X a = λ b S_{XX}^{-1}S_{XY}b=\lambda a \\ S_{YY}^{-1}S_{YX}a =\lambda b SXX1SXYb=λaSYY1SYXa=λb

  将上面第二个式子带入第一个式子,我们得到
S X X − 1 S X Y S Y Y − 1 S Y X a = λ 2 a S_{XX}^{-1}S_{XY}S_{YY}^{-1}S_{YX}a=\lambda^2a SXX1SXYSYY1SYXa=λ2a

  这个式子我们就熟悉了,这不就是特征分解吗!要求最大的相关系数 λ \lambda λ,我们只需要对矩阵 N = S X X − 1 S X Y S Y Y − 1 S Y X N=S_{XX}^{-1}S_{XY}S_{YY}^{-1}S_{YX} N=SXX1SXYSYY1SYX做特征分解,找出最大的特征值取平方根即可,此时最大特征值对应的特征向量即为X的线性系数 a a a

  同样的办法,我们将上面第一个式子带入第二个式子,我们得到 S Y Y − 1 S Y X S X X − 1 S X Y b = λ 2 b S_{YY}^{-1}S_{YX}S_{XX}^{-1}S_{XY}b=\lambda^2b SYY1SYXSXX1SXYb=λ2b, 我们只需要对矩阵 N ′ = S Y Y − 1 S Y X S X X − 1 S X Y N&#x27;=S_{YY}^{-1}S_{YX}S_{XX}^{-1}S_{XY} N=SYY1SYXSXX1SXY做特征分解,找出最大的特征值取平方根即可,此时最大特征值对应的特征向量即为Y的线性系数 b b b

  可以看出特征分解的方法要比SVD复杂,但是两者求得的结果其实是等价的,只要利用SVD和特征分解之间的关系就很容易发现两者最后的结果相同。

6. CCA算法流程

  这里我们对CCA的算法流程做一个总结,以SVD方法为准。

  输入:各为m个的样本X和Y,X和Y的维度都大于1
  输出:X,Y的相关系数 ρ \rho ρ,X和Y的线性系数向量a和b

  1 ) 计算X的方差 S X X S_{XX} SXX, Y的方差 S Y Y S_{YY} SYY,X和Y的协方差 S X Y S_{XY} SXY, Y和X的协方差 S Y X = S X Y T S_{YX}=S_{XY}^T SYX=SXYT
  2 ) 计算矩阵 M = S X X − 1 / 2 S X Y S Y Y − 1 / 2 M=S_{XX}^{-1/2}S_{XY}S_{YY}^{-1/2} M=SXX1/2SXYSYY1/2
  3 ) 对矩阵 M M M进行奇异值分解,得到最大的奇异值 ρ \rho ρ,和最大奇异值对应的左右奇异向量 u , v u,v u,v
  4 ) 计算X和Y的线性系数向量a和b, a = S X X − 1 / 2 u , b = S Y Y − 1 / 2 v a=S_{XX}^{-1/2}u, b=S_{YY}^{-1/2}v a=SXX1/2u,b=SYY1/2v

  可见算法流程并不复杂,但是要理解这个算法需要了解一些背景知识。

7. CCA算法小结

  CCA算法广泛的应用于数据相关度的分析,同时还是偏最小二乘法的基础。但是由于它依赖于数据的线性表示,当我们的数据无法线性表示时,CCA就无法使用,此时我们可以利用核函数的思想,将数据映射到高维后,再利用CCA的思想降维到1维,求对应的相关系数和线性关系,这个算法一般称为KCCA。

  此外,我们在算法里只找了相关度最大的奇异值或者特征值,作为数据的相关系数,实际上我们也可以像PCA一样找出第二大奇异值,第三大奇异值,。。。得到第二相关系数和第三相关系数。然后对数据做进一步的相关性分析。但是一般的应用来说,找出第一相关系数就可以了。

  有时候我们的矩阵 S X X , S Y Y S_{XX},S_{YY} SXX,SYY不可逆,此时我们得不到对应的逆矩阵,一般遇到这种情况可以对 S X X , S Y Y S_{XX},S_{YY} SXX,SYY进行正则化,将 S X X , S Y Y S_{XX},S_{YY} SXX,SYY变化为 S X X + γ I , S Y Y + γ I S_{XX}+\gamma I,S_{YY}+\gamma I SXX+γI,SYY+γI,然后继续求逆。其中 γ \gamma γ为正则化系数。


(欢迎转载,转载请注明出处 刘建平Pinard:https://www.cnblogs.com/pinard/p/6288716.html)

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
CCACanonical Correlation Analysis)典型相关分析是一种多元统计分析方法,用于研究两组变量之间的线性关系。其基本思想是将两组变量通过线性变换映射到低维空间中,使得两组变量在该空间中的相关性最大。具体来说,CCA通过构造Lagrangian等式,利用拉格朗日乘子法求解出两组变量的典型相关变量,即两组变量在低维空间中的投影向量,从而得到它们之间的典型相关系数。典型相关系数越大,说明两组变量之间的相关性越强。 在实际应用中,CCA可以用于数据降维、特征提取、模式识别等领域。例如,在故障检测中,可以利用CCA分析传感器数据和故障模式之间的关系,从而实现故障检测和诊断。 代码示例: ```python import numpy as np from scipy.linalg import eig # 构造两组变量X和Y X = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) Y = np.array([[9, 8, 7], [6, 5, 4], [3, 2, 1]]) # 计算X和Y的协方差矩阵 Cxx = np.cov(X.T) Cyy = np.cov(Y.T) Cxy = np.cov(X.T, Y.T) # 计算广义特征值和广义特征向量 eigvals, eigvecs = eig(np.dot(np.dot(np.linalg.inv(Cxx), Cxy), np.dot(np.linalg.inv(Cyy), Cxy.T))) # 取前k个最大的广义特征值对应的广义特征向量 k = 2 idx = np.argsort(eigvals)[::-1][:k] Wx = eigvecs[:, idx].real Wy = np.dot(np.dot(np.linalg.inv(Cyy), Cxy.T), Wx).real # 计算典型相关变量 U = np.dot(X, Wx) V = np.dot(Y, Wy) # 计算典型相关系数 R = np.corrcoef(U.T, V.T)[k:, :k] print("典型相关系数:", R) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值