4

典型相关分析CCA计算过程 - 阿升1990

 2 years ago
source link: https://www.cnblogs.com/shengshengwang/p/16545070.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

  本文介绍了CCA解决的问题,CCA原理的推导过程,以及对计算结果物理意义的解释。并且通过SPSS和R操作演示了一个关于CCA的例子。数据文件下载参考[8],SPSS输出结果文件下载参考[9],R代码文件下载参考[10]。

一.CCA工作原理

1.CCA定义

  首先需要搞清楚典型相关分析(Canonical Correlation Analysis)解决了什么问题,它解决的是一组变量与另外一组变量的相关问题。举个例子,比如想要量化家庭特征与家庭消费之间的关系,其中,家庭特征包括户主的年龄、家庭的年收入和户主受教育程序,而家庭消费包括每年去餐厅就餐的频率、每年外出看电影频率
  其实,这个是泛化后的问题,先来看一个更加具体的问题,不是一组变量与另外一组变量的相关问题,而是一个变量与另外一个变量的相关问题,比如计算两个变量XX和YY的相关问题,是如何计算的呢,下面的方程是不是很眼熟:

ρXY=cov(X,Y)var(X)var(Y)−−−−−−−−−−−−√ρXY=cov(X,Y)var(X)var(Y)

  再进一步的想一下,如果是计算一个变量和一组变量的相关问题呢。当然更深一步的想象就是这篇文章要讲的一组变量与另外一组变量的相关问题。先来形式化的定义CCA:假设有一组变量X1,⋯,XpX1,⋯,Xp与另一组变量Y1,⋯,YqY1,⋯,Yq,要研究这两组变量的相关关系,如何给两组变量之间的相关性以数量的描述,就是CCA。

二.CCA方程推导过程

1.CCA的数学描述

  假设x1x1表示每年去餐馆就餐的频率,x2x2表示每年外出看电影频率,y1y1表示户主的年龄,y2y2表示家庭的年收入,y3y3表示户主受教育程度。典型相关分析的思想是找出第一对线性组合,使其具有最大相关性:

u1=a11x1+a21x2+...+ap1xpv1=b11y1+b21y2+b31y3+...+bq1yqρ(u1,v1)=?u1=a11x1+a21x2+...+ap1xpv1=b11y1+b21y2+b31y3+...+bq1yqρ(u1,v1)=?

然后再找第二对线性组合,使其具有次大相关性:

u2=a12x1+a22x2+...+ap2xpv2=b12y1+b22y2+b32y3+...+bq2yqρ(u2,v2)=?u2=a12x1+a22x2+...+ap2xpv2=b12y1+b22y2+b32y3+...+bq2yqρ(u2,v2)=?

就这样一直进行计算下去,直到第rr步,这两组变量的相关性被提取完毕为止,其中r≤min(p,q)r≤min(p,q),即可以得到rr组变量。

2.CCA的推导过程

假设两组变量的向量Z=(x1,x2,...,xp,y1,y2,...,yq)Z=(x1,x2,...,xp,y1,y2,...,yq),其协方差矩阵如下:

∑=[∑11∑12∑21∑12]∑=[∑11∑12∑21∑12]

其中,∑11∑11是第一组变量的协方差矩阵,∑22∑22是第二组变量的协方差矩阵,∑12∑12和∑21∑21是XX和YY的协方差矩阵,它们之间的关系是转置相等,即∑12=∑T21∑12=∑21T。这样两组变量的第一对线性组合记为:

u1=aT1Xv1=bT1Yu1=a1TXv1=b1TY

其中a1a1和b1b1表示:

a1=(a11,a21,...,ap1)Tb1=(b11,b21,...,bq1)Ta1=(a11,a21,...,ap1)Tb1=(b11,b21,...,bq1)T

接下来推导ρu1,v1ρu1,v1的计算,通过求a1a1和b1b1,使ρu1,v1ρu1,v1最大,这个是CCA最核心的思想:

var(u1)=aT1var(X)a1=aT1∑11a1=1var(v1)=bT1var(Y)b1=bT1∑22b1=1ρu1,v1=cov(u1,v1)=aT1cov(X,Y)b1=aT1∑12b1var(u1)=a1Tvar(X)a1=a1T∑11a1=1var(v1)=b1Tvar(Y)b1=b1T∑22b1=1ρu1,v1=cov(u1,v1)=a1Tcov(X,Y)b1=a1T∑12b1

接下来就是典型相关系数的过程。根据高等数学中条件极致的求法,即拉格朗日乘数法,通过引入拉格朗日乘数λλ和νν来求极值的问题,转换为求方程1的极大值:

ϕ(a1,b1)=aT1∑12b1−λ2(aT1∑11a1−1)−ν2(bT1∑22b1−1)ϕ(a1,b1)=a1T∑12b1−λ2(a1T∑11a1−1)−ν2(b1T∑22b1−1)

接下来就是求极大值的思路了,各种求偏导,方程2如下所示:

∂ϕ∂a1=∑12b1−λ∑11a1=0∂ϕ∂b1=∑21a1−v∑22b1=0∂ϕ∂a1=∑12b1−λ∑11a1=0∂ϕ∂b1=∑21a1−v∑22b1=0

方程3如下所示:

∑12b1−λ∑11a1=0∑21a1−v∑22b1=0∑12b1−λ∑11a1=0∑21a1−v∑22b1=0

将方程3分别左乘aT1a1T和bT1b1T,得到方程4:

aT1∑12b1−λaT1∑11a1=0bT1∑21a1−vbT1∑22b1=0a1T∑12b1−λa1T∑11a1=0b1T∑21a1−vb1T∑22b1=0

进一步推导得出方程5:

aT1∑12b1=λbT1∑21a1=va1T∑12b1=λb1T∑21a1=v

因此得到方程6:

λ=v=aT1∑12b1=ρ(u1,v1)λ=v=a1T∑12b1=ρ(u1,v1)

可见λλ和vv是相等的,并且就是要求的ρu1,v1ρu1,v1。

将∑12∑−122∑12∑22−1左乘方程3的第二式,得到方程7:

∑12∑−122∑21a1−v∑12∑−122∑22b1=0∑12∑22−1∑21a1−v∑12∑22−1∑22b1=0

进一步简化得到方程8:

∑12∑−122∑21a1−v∑12b1=0∑12∑22−1∑21a1−v∑12b1=0

将方程3的第一式代入方程8,得到方程9:

∑12∑−122∑21a1−λ2∑11a1=0∑12∑22−1∑21a1−λ2∑11a1=0

将方程9左乘∑−111∑11−1得到方程10:

∑−111∑12∑−122∑21a1−λ2a1=0∑11−1∑12∑22−1∑21a1−λ2a1=0

在方程10中,∑−111∑12∑−122∑21∑11−1∑12∑22−1∑21的特征根是λ2λ2,相应的特征向量为a1a1。

将∑12∑−111∑12∑11−1左乘方程3的第一式,并且将第二式代入得到方程11:

∑21∑−111∑21b1−λ∑12a1=0∑21∑−111∑12b1−λ2∑22b1=0∑−122∑21∑−111∑12b1−λ2b1=0∑21∑11−1∑21b1−λ∑12a1=0∑21∑11−1∑12b1−λ2∑22b1=0∑22−1∑21∑11−1∑12b1−λ2b1=0

在方程11中,∑−122∑21∑−111∑12∑22−1∑21∑11−1∑12的特征根是λ2λ2,相应的特征向量为b1b1。

令M1=∑−111∑12∑−122∑21M1=∑11−1∑12∑22−1∑21和M2=∑−122∑21∑−111∑12M2=∑22−1∑21∑11−1∑12,得到方程12:

M1a=λ2aM2b=λ2bM1a=λ2aM2b=λ2b

至此可以得出结论:第一个典型相关系数为λ1λ1(最大特征值),其中λ21λ12既是M1M1又是M2M2的特征根,第一对典型变量的系数a1a1和b1b1是相应于M1M1和M2M2的特征向量。这样就把典型相关分析的求解转换成了求M1M1和M2M2的特征根和特征向量的问题。

说明:第一对典型变量提取了原始变量XX和YY之间相关的主要部分,如果这部分不能足以解释原始变量,可以在剩余的相关中再求出第二对典型变量和它们的典型相关系数。如此反复,直到这两组变量的相关性被提取完毕为止。

3.CCA的物理意义

  还是以量化家庭特征与家庭消费之间的关系为例子,假设x1x1表示每年去餐馆就餐的频率,x2x2表示每年外出看电影频率,y1y1表示户主的年龄,y2y2表示家庭的年收入,y3y3表示户主受教育程度。如果计算出第一典型相关系数为0.687948,第二典型相关系数为0.186865。第一典型变量和第二典型变量代入方程如下所示:
(1)第一对典型变量

u1=0.9866x1+0.8872x2v1=0.4211y1+0.9822y2+0.5145y3u1=0.9866x1+0.8872x2v1=0.4211y1+0.9822y2+0.5145y3
  • u1u1量化的是家庭消费特征,它与x1x1和x2x2的相关系数分别为0.9866和0.8872,这2个值都是比较高的。
  • v1v1量化的是家庭特征,它与y2y2的相关系数为0.9822,其它的相关系数较小,因此v1v1主要代表的就是家庭收入。
  • u1u1和v1v1的相关系数为0.687948,说明一个家庭的消费和家庭的收入关系密切。

(2)第二对典型变量

u2=−0.1632x1+0.4614x2v2=0.8464y1+−0.1101y2+0.3013y3u2=−0.1632x1+0.4614x2v2=0.8464y1+−0.1101y2+0.3013y3
  • u2u2和x2x2的相关系数为0.4614,可见u2u2主要代表的是每年外出看电影频率。
  • v2v2和y1y1的相关系数为0.8464,可见v2v2主要代表的是家庭成员的年龄特征。
  • u2u2和v2v2的相关系数为0.186865,说明一个家庭每年外出看电影频率和家庭成员的年龄特征关系密切。

三.CCA代码例子

1.SPSS28实现

(1)变量视图和数据视图

79091666-ad5c-4cec-aa02-2bf4b2575df8.png
2466f8fc-5119-4861-ac2b-a30641d0925e.png

(2)分析->相关->典型相关分析

6d324a1a-e89e-4d3a-88cf-e92ba8cdccac.png

将控制情绪、自我调节、自我激励作为集合1,将语文、数学、英语和才艺作为集合2:

f53d8f8b-fd5e-413f-935f-728cabca9582.png

(3)生成结果

d2175005-d174-43e7-b6cb-bb4dc9fe08e9.png

2.R编程实现

(1)安装R包
操作系统使用的Windows10,版本号为20H2,R语言版本使用64位的R-3.6.3。期初在安装R包的时候总是报错,经过查找资料,需要将Packages页面中的第2和3个复选框去掉,重启RStudio即可:

cea59957-519f-43b3-a37c-dded741365e7.png

依次安装openxlsx、CCA和CCP包:

install.packages("openxlsx", dependencies=TRUE)
install.packages("CCA", dependencies=TRUE)
install.packages("CCP", dependencies=TRUE)

(2)R代码实现

6a657d43-0659-45b5-9ebe-822ef560a94a.png
# 1.加载数据
library(openxlsx)
rawdata <- read.xlsx("F:/cca_data.xlsx", sheet = "典型相关分析")
names(rawdata)

# 2.对两组变量的数据做标准化处理
xdata = scale(rawdata[, 1:3])
ydata = scale(rawdata[, 4:7])

# 3.执行典型相关分析
library(CCA)
mycca = cc(xdata, ydata)
mycca

# 4.检验典型相关系数在统计上是否显著
library(CCP)
rho = mycca$cor
n = dim(rawdata)[1]
p = dim(xdata)[2]
q = dim(ydata)[2]
p.asym(rho, n, p, q, tstat = 'Wilks')

(3)输出结果

> # 1.加载数据
> library(openxlsx)
> rawdata <- read.xlsx("F:/cca_data.xlsx", sheet = "典型相关分析")
> names(rawdata)
[1] "控制情绪" "自我调节" "自我激励" "语文"     "数学"     "英语"     "才艺"    
> 
> # 2.对两组变量的数据做标准化处理
> xdata = scale(rawdata[, 1:3])
> ydata = scale(rawdata[, 4:7])
> 
> # 3.执行典型相关分析
> library(CCA)
> mycca = cc(xdata, ydata)
> mycca
$cor
[1] 0.9944827 0.8781065 0.3836057

$names
$names$Xnames
[1] "控制情绪" "自我调节" "自我激励"

$names$Ynames
[1] "语文" "数学" "英语" "才艺"

$names$ind.names
 [1] "1"  "2"  "3"  "4"  "5"  "6"  "7"  "8"  "9"  "10" "11" "12" "13" "14" "15" "16" "17" "18" "19" "20" "21" "22" "23" "24" "25" "26"
[27] "27" "28" "29" "30" "31" "32" "33" "34" "35" "36" "37" "38" "39" "40" "41" "42" "43" "44" "45" "46" "47" "48" "49" "50"


$xcoef
               [,1]      [,2]      [,3]
控制情绪 -0.4576880 -1.277214  2.767301
自我调节 -0.2118578  2.451745 -1.048019
自我激励 -0.3687696 -1.122893 -1.806735

$ycoef
           [,1]       [,2]       [,3]
语文 -0.2755155 -0.7599743 -0.9739351
数学 -0.1040424  0.6822849  0.4802843
英语 -0.1916330 -1.0607433  0.5995720
才艺 -0.6620838  0.7198947 -0.1194195

$scores
$scores$xscores
          [,1]         [,2]        [,3]
1   0.97838292 -0.362539552  0.81938141
2   1.40651588 -0.410239408  0.05351720
......
49 -0.68982939 -1.133476875  0.34804581
50 -0.86681530  1.107521445  0.63269334

$scores$yscores
          [,1]        [,2]        [,3]
1   0.97479103  0.09430244 -0.08851950
2   1.40034960 -0.76140727  0.45769014
......
49 -0.64792179 -1.26188686 -0.66195176
50 -0.73030445  0.62990478  0.08452069

$scores$corr.X.xscores
               [,1]          [,2]         [,3]
控制情绪 -0.9798776  0.0006477883  0.199598477
自我调节 -0.9464085  0.3228847489 -0.007504408
自我激励 -0.9518620 -0.1863009724 -0.243414776

$scores$corr.Y.xscores
           [,1]       [,2]        [,3]
语文 -0.6348095 -0.1894059 -0.24988439
数学 -0.7171837  0.2086069  0.02598458
英语 -0.6436782 -0.4402237  0.22027544
才艺 -0.9388771  0.1734549  0.03614570

$scores$corr.X.yscores
               [,1]          [,2]         [,3]
控制情绪 -0.9744713  0.0005688272  0.076567107
自我调节 -0.9411869  0.2835272081 -0.002878734
自我激励 -0.9466102 -0.1635921013 -0.093375287

$scores$corr.Y.yscores
           [,1]       [,2]        [,3]
语文 -0.6383313 -0.2156981 -0.65140953
数学 -0.7211626  0.2375644  0.06773775
英语 -0.6472493 -0.5013329  0.57422365
才艺 -0.9440859  0.1975329  0.09422619

> # 4.检验典型相关系数在统计上是否显著
> library(CCP)
> rho = mycca$cor
> n = dim(rawdata)[1]
> p = dim(xdata)[2]
> q = dim(ydata)[2]
> p.asym(rho, n, p, q, tstat = 'Wilks')
Wilks' Lambda, using F-approximation (Rao's F):
                stat    approx df1      df2      p.value
1 to 3:  0.002148472 87.391525  12 114.0588 0.000000e+00
2 to 3:  0.195241267 18.526265   6  88.0000 8.248957e-14
3 to 3:  0.852846693  3.882233   2  45.0000 2.783536e-02

从结果上来看,无论是SPSS还是R,计算的结果都是完全相同的。

参考文献:
[1]典型相关分析:https://www.bilibili.com/video/BV1LZ4y1S7Vd
[2]sklearn.cross_decomposition.CCA:https://scikit-learn.org/stable/modules/generated/sklearn.cross_decomposition.CCA.html
[3]协方差矩阵:https://baike.baidu.com/item/协方差矩阵/9822183
[4]典型相关分析(CCA)原理及Python实现:https://developer.aliyun.com/article/839949
[5]CCA典型关联分析原理与Python案例:https://cloud.tencent.com/developer/article/1652998
[6]典型关联分析(CCA)原理总结:https://www.cnblogs.com/pinard/p/6288716.html
[7]典型相关分析:https://www.docin.com/p-212673286.html
[8]数据文件cca_data.xlsx:https://url39.ctfile.com/f/2501739-631515818-1a4a0d?p=2096 (访问密码: 2096)
[9]SPSS输出结果文件:https://url39.ctfile.com/f/2501739-631515819-214c93?p=2096 (访问密码: 2096)
[10]R代码文件:https://url39.ctfile.com/f/2501739-631515820-50502e?p=2096 (访问密码: 2096)


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK