本文介绍了 CCA 解决的问题,CCA 原理的推导过程,以及对计算结果物理意义的解释。并且通过 SPSS 和 R 操作演示了一个对于 CCA 的例子。数据文件下载参考[8],SPSS 输入后果文件下载参考[9],R 代码文件下载参考[10]。
一.CCA 工作原理
1.CCA 定义
首先须要搞清楚典型相干剖析 (Canonical Correlation Analysis) 解决了什么问题,它解决的是一组变量与另外一组变量的相干问题。举个例子,比方想要量化家庭特色与家庭生产之间的关系,其中,家庭特色包含户主的年龄、家庭的年收入和户主受教育程序,而家庭生产包含每年去餐厅就餐的频率、每年外出看电影频率。
其实,这个是泛化后的问题,先来看一个更加具体的问题,不是一组变量与另外一组变量的相干问题,而是一个变量与另外一个变量的相干问题,比方计算两个变量 ${X}$ 和 ${Y}$ 的相干问题,是如何计算的呢,上面的方程是不是很眼生:
$$
{\rho _{XY}} = \frac{{{\mathop{\rm cov}} \left({X,Y} \right)}}{{\sqrt {{\mathop{\rm var}} \left(X \right){\mathop{\rm var}} \left(Y \right)} }}
$$
再进一步的想一下,如果是计算一个变量和一组变量的相干问题呢。当然更深一步的设想就是这篇文章要讲的一组变量与另外一组变量的相干问题。先来形式化的定义 CCA:假如有一组变量 ${X_1}, \cdots ,{X_p}$ 与另一组变量 ${Y_1}, \cdots ,{Y_q}$,要钻研这两组变量的相干关系,如何给两组变量之间的相关性以数量的形容,就是 CCA。
二.CCA 方程推导过程
1.CCA 的数学形容
假如 ${x_1}$ 示意每年去餐馆就餐的频率,${x_2}$ 示意每年外出看电影频率,${y_1}$ 示意户主的年龄,${y_2}$ 示意家庭的年收入,${y_3}$ 示意户主受教育水平。典型相干剖析的思维是找出第一对线性组合,使其具备最大相关性:
$$
\begin{array}{l}
{u_1} = {a_{11}}{x_1} + {a_{21}}{x_2}+…+ {a_{p1}}{x_p}\\
{v_1} = {b_{11}}{y_1} + {b_{21}}{y_2} + {b_{31}}{y_3} +…+{b_{q1}}{y_q}\\
\rho \left({{u_1},{v_1}} \right) = ? \\
\end{array}
$$
而后再找第二对线性组合,使其具备次大相关性:
$$
\begin{array}{l}
{u_2} = {a_{12}}{x_1} + {a_{22}}{x_2}+…+ {a_{p2}}{x_p} \\
{v_2} = {b_{12}}{y_1} + {b_{22}}{y_2} + {b_{32}}{y_3} +…+{b_{q2}}{y_q} \\
\rho \left({{u_2},{v_2}} \right) = ? \\
\end{array}
$$
就这样始终进行计算上来,直到第 $r$ 步,这两组变量的相关性被提取结束为止,其中 $r \le \min \left({{\rm{p}},{\rm{q}}} \right)$,即能够失去 $r$ 组变量。
2.CCA 的推导过程
假如两组变量的向量 ${\bf{Z}} = \left({{x_1},{x_2},…,{x_p},{y_1},{y_2},…,{y_q}} \right)$,其协方差矩阵如下:
$$
\sum = \left[\begin{array}{l}
\sum\nolimits_{11} \sum\nolimits_{12} \\
\sum\nolimits_{21} \sum\nolimits_{12} \\
\end{array} \right]
$$
其中,$\sum\nolimits_{11}$ 是第一组变量的协方差矩阵,$\sum\nolimits_{22}$ 是第二组变量的协方差矩阵,$\sum\nolimits_{12}$ 和 $\sum\nolimits_{21}$ 是 $X$ 和 $Y$ 的协方差矩阵,它们之间的关系是转置相等,即 $\sum\nolimits_{12} = {\sum\nolimits_{21} ^{\rm{T}}}$。这样两组变量的第一对线性组合记为:
$$
\begin{array}{l}
{{\bf{u}}_1} = {\bf{a}}_1^{\rm{T}}{\bf{X}} \\
{{\bf{v}}_1} = {\bf{b}}_1^{\rm{T}}{\bf{Y}} \\
\end{array}
$$
其中 ${\bf{a}}_1$ 和 ${\bf{b}}_1$ 示意:
$$
\begin{array}{l}
{{\bf{a}}_1} = {\left( {{a_{11}},{a_{21}},…,{a_{p1}}} \right)^{\rm{T}}} \\
{{\bf{b}}_1} = {\left( {{b_{11}},{b_{21}},…,{b_{q1}}} \right)^{\rm{T}}} \\
\end{array}
$$
接下来推导 ${\rho _{{{\bf{u}}_1},{{\bf{v}}_1}}}$ 的计算,通过求 ${\bf{a}}_1$ 和 ${\bf{b}}_1$,使 ${\rho _{{{\bf{u}}_1},{{\bf{v}}_1}}}$ 最大,这个是 CCA 最外围的思维:
$$
\begin{array}{l}
{\mathop{\rm var}} \left({{{\bf{u}}_1}} \right) = {\bf{a}}_1^{\rm{T}}{\mathop{\rm var}} \left({\bf{X}} \right){{\bf{a}}_1} = {\bf{a}}_1^{\rm{T}}\sum\nolimits_{11} {} {{\bf{a}}_1} = 1 \\
{\mathop{\rm var}} \left({{{\bf{v}}_1}} \right) = {\bf{b}}_1^T{\mathop{\rm var}} \left({\bf{Y}} \right){{\bf{b}}_1} = {\bf{b}}_1^T\sum\nolimits_{22} {} {{\bf{b}}_1} = 1 \\
{\rho _{{{\bf{u}}_1},{{\bf{v}}_1}}} = {\rm{cov}}\left({{{\bf{u}}_1},{{\bf{v}}_1}} \right) = {\bf{a}}_1^{\rm{T}}{\rm{cov}}\left({{\bf{X}},{\bf{Y}}} \right){{\bf{b}}_1} = {\bf{a}}_1^{\rm{T}}\sum\nolimits_{12} {} {{\bf{b}}_1} \\
\end{array}
$$
接下来就是典型相关系数的过程。依据高等数学中条件极致的求法,即拉格朗日乘数法,通过引入拉格朗日乘数 $\lambda$ 和 $\nu$ 来求极值的问题,转换为求方程 1 的极大值:
$$
\phi \left({{{\bf{a}}_1},{{\bf{b}}_1}} \right) = {\bf{a}}_1^{\rm{T}}\sum\nolimits_{12} {} {{\bf{b}}_1} – \frac{\lambda}{2}\left({{\bf{a}}_1^{\rm{T}}\sum\nolimits_{11} {{{\bf{a}}_1}} – 1} \right) – \frac{\nu}{2}\left({{\bf{b}}_1^{\rm{T}}\sum\nolimits_{22} {{{\bf{b}}_1}} – 1} \right)
$$
接下来就是求极大值的思路了,各种求偏导,方程 2 如下所示:
$$
\begin{array}{l}
\frac{{\partial \phi}}{{\partial {{\bf{a}}_1}}} = \sum\nolimits_{12} {{{\bf{b}}_1}} – \lambda \sum\nolimits_{11} {{{\bf{a}}_1}} = 0 \\
\frac{{\partial \phi}}{{\partial {{\bf{b}}_1}}} = \sum\nolimits_{21} {{{\bf{a}}_1}} – v\sum\nolimits_{22} {{{\bf{b}}_1}} = 0 \\
\end{array}
$$
方程 3 如下所示:
$$
\begin{array}{l}
\sum\nolimits_{12} {{{\bf{b}}_1}} – \lambda \sum\nolimits_{11} {{{\bf{a}}_1}} = 0 \\
\sum\nolimits_{21} {{{\bf{a}}_1}} – v\sum\nolimits_{22} {{{\bf{b}}_1}} = 0 \\
\end{array}
$$
将方程 3 别离左乘 ${\bf{a}}_1^{\rm{T}}$ 和 ${\bf{b}}_1^{\rm{T}}$,失去方程 4:
$$
\begin{array}{l}
{\bf{a}}_1^{\rm{T}}\sum\nolimits_{12} {{{\bf{b}}_1}} – \lambda {\bf{a}}_1^{\rm{T}}\sum\nolimits_{11} {{{\bf{a}}_1}} = 0 \\
{\bf{b}}_1^{\rm{T}}\sum\nolimits_{21} {{{\bf{a}}_1}} – v{\bf{b}}_1^{\rm{T}}\sum\nolimits_{22} {{{\bf{b}}_1}} = 0 \\
\end{array}
$$
进一步推导得出方程 5:
$$
\begin{array}{l}
{\bf{a}}_1^{\rm{T}}\sum\nolimits_{12} {{{\bf{b}}_1}} = \lambda \\
{\bf{b}}_1^{\rm{T}}\sum\nolimits_{21} {{{\bf{a}}_1}} = v \\
\end{array}
$$
因而失去方程 6:
$$
\lambda = v = {\bf{a}}_1^{\rm{T}}\sum\nolimits_{12} {{{\bf{b}}_1}} = {\rho _{\left( {{{\bf{u}}_1},{\bf{v}}1} \right)}}
$$
可见 $\lambda$ 和 $v$ 是相等的,并且就是要求的 ${\rho _{{{\bf{u}}_1},{{\bf{v}}_1}}}$。
将 $\sum\nolimits_{12} \sum\nolimits_{22}^{– 1}$ 左乘方程 3 的第二式,失去方程 7:
$$
\sum\nolimits_{12} \sum\nolimits_{22}^{– 1} \sum\nolimits_{21} {{\bf{a}}_1} – v\sum\nolimits_{12} \sum\nolimits_{22}^{– 1} \sum\nolimits_{22} {} {{\bf{b}}_1} = 0
$$
进一步简化失去方程 8:
$$
\sum\nolimits_{12} \sum\nolimits_{22}^{– 1} \sum\nolimits_{21} {} {{\bf{a}}_1} – v\sum\nolimits_{12} {{\bf{b}}_1} = 0
$$
将方程 3 的第一式代入方程 8,失去方程 9:
$$
\sum\nolimits_{12} \sum\nolimits_{22}^{– 1} \sum\nolimits_{21} {{\bf{a}}_1} – {\lambda ^2}\sum\nolimits_{11} {{\bf{a}}_1} = 0
$$
将方程 9 左乘 $\sum\nolimits_{11}^{– 1}$ 失去方程 10:
$$
\sum\nolimits_{11}^{– 1} {} \sum\nolimits_{12} {} \sum\nolimits_{22}^{– 1} {} \sum\nolimits_{21} {} {{\bf{a}}_1} – {\lambda ^2}{{\bf{a}}_1} = 0
$$
在方程 10 中,$\sum\nolimits_{11}^{– 1} \sum\nolimits_{12} \sum\nolimits_{22}^{– 1} \sum\nolimits_{21}$ 的特色根是 ${\lambda ^2}$,相应的特征向量为 ${{\bf{a}}_1}$。
将 $\sum\nolimits_{12} \sum\nolimits_{11}^{– 1}$ 左乘方程 3 的第一式,并且将第二式代入失去方程 11:
$$
\begin{array}{l}
\sum\nolimits_{21} {} \sum\nolimits_{11}^{– 1} {} \sum\nolimits_{21} {{{\bf{b}}_1}} – \lambda \sum\nolimits_{12} {{{\bf{a}}_1}} = 0 \\
\sum\nolimits_{21} {} \sum\nolimits_{11}^{– 1} {} \sum\nolimits_{12} {{{\bf{b}}_1}} – {\lambda ^2}\sum\nolimits_{22} {{{\bf{b}}_1}} = 0 \\
\sum\nolimits_{22}^{– 1} {} \sum\nolimits_{21} {} \sum\nolimits_{11}^{– 1} {} \sum\nolimits_{12} {{{\bf{b}}_1}} – {\lambda ^2}{{\bf{b}}_1} = 0 \\
\end{array}
$$
在方程 11 中,$\sum\nolimits_{22}^{– 1} \sum\nolimits_{21} \sum\nolimits_{11}^{– 1} \sum\nolimits_{12}$ 的特色根是 ${\lambda ^2}$,相应的特征向量为 ${{\bf{b}}_1}$。
令 ${{\bf{M}}_{\rm{1}}} = \sum\nolimits_{11}^{– 1} {} \sum\nolimits_{12} {} \sum\nolimits_{22}^{– 1} {} \sum\nolimits_{21} {}$ 和 ${{\bf{M}}_2}{\rm{ =}}\sum\nolimits_{22}^{– 1} {} \sum\nolimits_{21} {} \sum\nolimits_{11}^{– 1} {} \sum\nolimits_{12} {}$,失去方程 12:
$$
\begin{array}{l}
{{\bf{M}}_{\rm{1}}}{{\bf{a}}}{\rm{ =}}{\lambda ^2}{{\bf{a}}} \\
{{\bf{M}}_2}{{\bf{b}}}{\rm{ =}}{\lambda ^2}{{\bf{b}}} \\
\end{array}
$$
至此能够得出结论:第一个典型相关系数为 $\lambda_1$(最大特征值),其中 $\lambda _1^2$ 既是 ${\bf{M}}_{\rm{1}}$ 又是 ${\bf{M}}_{\rm{2}}$ 的特色根,第一对典型变量的系数 ${{\bf{a}}_1}$ 和 ${{\bf{b}}_1}$ 是相应于 ${\bf{M}}_{\rm{1}}$ 和 ${\bf{M}}_{\rm{2}}$ 的特征向量。这样就把典型相干剖析的求解转换成了求 ${\bf{M}}_{\rm{1}}$ 和 ${\bf{M}}_{\rm{2}}$ 的特色根和特征向量的问题。
阐明:第一对典型变量提取了原始变量 $X$ 和 $Y$ 之间相干的次要局部,如果这部分不能足以解释原始变量,能够在残余的相干中再求出第二对典型变量和它们的典型相关系数。如此重复,直到这两组变量的相关性被提取结束为止。
3.CCA 的物理意义
还是以量化家庭特色与家庭生产之间的关系为例子,假如 ${x_1}$ 示意每年去餐馆就餐的频率,${x_2}$ 示意每年外出看电影频率,${y_1}$ 示意户主的年龄,${y_2}$ 示意家庭的年收入,${y_3}$ 示意户主受教育水平。如果计算出第一典型相关系数为 0.687948,第二典型相关系数为 0.186865。第一典型变量和第二典型变量代入方程如下所示:
(1)第一对典型变量
$$
\begin{array}{l}
{u_1} = {0.9866}{x_1} + {0.8872}{x_2} \\
{v_1} = {0.4211}{y_1} + {0.9822}{y_2} + {0.5145}{y_3} \\
\end{array}
$$
- ${u_1}$ 量化的是家庭生产特色,它与 ${x_1}$ 和 ${x_2}$ 的相关系数别离为 0.9866 和 0.8872,这 2 个值都是比拟高的。
- ${v_1}$ 量化的是家庭特色,它与 ${y_2}$ 的相关系数为 0.9822,其它的相关系数较小,因而 ${v_1}$ 次要代表的就是家庭收入。
- ${u_1}$ 和 ${v_1}$ 的相关系数为 0.687948,阐明一个家庭的生产和家庭的支出关系密切。
(2)第二对典型变量
$$
\begin{array}{l}
{u_2} = {-0.1632}{x_1} + {0.4614}{x_2} \\
{v_2} = {0.8464}{y_1} + {-0.1101}{y_2} + {0.3013}{y_3} \\
\end{array}
$$
- ${u_2}$ 和 ${x_2}$ 的相关系数为 0.4614,可见 ${u_2}$ 次要代表的是每年外出看电影频率。
- ${v_2}$ 和 ${y_1}$ 的相关系数为 0.8464,可见 ${v_2}$ 次要代表的是家庭成员的年龄特征。
- ${u_2}$ 和 ${v_2}$ 的相关系数为 0.186865,阐明一个家庭每年外出看电影频率和家庭成员的年龄特征关系密切。
三.CCA 代码例子
1.SPSS28 实现
(1)变量视图和数据视图
(2)剖析 -> 相干 -> 典型相干剖析
将控制情绪、自我调节、自我激励作为汇合 1,将语文、数学、英语和才艺作为汇合 2:
(3)生成后果
2.R 编程实现
(1)装置 R 包
操作系统应用的 Windows10,版本号为 20H2,R 语言版本应用 64 位的 R -3.6.3。期初在装置 R 包的时候总是报错,通过查找材料,须要将 Packages 页面中的第 2 和 3 个复选框去掉,重启 RStudio 即可:
顺次装置 openxlsx、CCA 和 CCP 包:
install.packages("openxlsx", dependencies=TRUE)
install.packages("CCA", dependencies=TRUE)
install.packages("CCP", dependencies=TRUE)
(2)R 代码实现
# 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/vide…
[2]sklearn.cross_decomposition.CCA:https://scikit-learn.org/stab…
[3]协方差矩阵:https://baike.baidu.com/item/ 协方差矩阵 /9822183
[4]典型相干剖析 (CCA) 原理及 Python 实现:https://developer.aliyun.com/…
[5]CCA 典型关联剖析原理与 Python 案例:https://cloud.tencent.com/dev…
[6]典型关联剖析 (CCA) 原理总结:https://www.cnblogs.com/pinar…
[7]典型相干剖析:https://www.docin.com/p-21267…
[8]数据文件 cca_data.xlsx:https://url39.ctfile.com/f/25… (拜访明码: 2096)
[9]SPSS 输入后果文件:https://url39.ctfile.com/f/25… (拜访明码: 2096)
[10]R 代码文件:https://url39.ctfile.com/f/25… (拜访明码: 2096)
本文由 mdnice 多平台公布