跳转到内容

典型相关分析(CCA)

快速概览

CCA 通过寻找两组变量的线性组合使它们之间的相关性最大化,是分析两组数据关联的经典统计方法,也是多组学整合的重要基础。

  • 核心是最大化跨组学相关性,而非重构误差
  • 可扩展到多组学(Group CCA)和非线性场景(Kernel CCA、Deep CCA)
  • 是理解现代深度多模态学习对比损失的思想源头

典型相关分析(Canonical Correlation Analysis, CCA) 是 Pearson 相关分析在多变量场景下的自然扩展,旨在寻找两组变量之间的最大线性关联。

输入

  • XRn×pX \in \mathbb{R}^{n \times p}:第一组变量(如基因表达矩阵)
  • YRn×qY \in \mathbb{R}^{n \times q}:第二组变量(如甲基化矩阵)
  • 其中 nn 为样本数,ppqq 分别为两组变量的维度

输出

  • WxRp×rW_x \in \mathbb{R}^{p \times r}XX 的权重矩阵(投影方向)
  • WyRq×rW_y \in \mathbb{R}^{q \times r}YY 的权重矩阵(投影方向)
  • ρRr\rho \in \mathbb{R}^r:典型相关系数(相关性强度)
  • URn×rU \in \mathbb{R}^{n \times r}XX 的典型变量(低维表示)
  • VRn×rV \in \mathbb{R}^{n \times r}YY 的典型变量(低维表示)

CCA 寻找线性组合:

  • u=Xwxu = X w_xXX 的典型变量,canonical variate)
  • v=Ywyv = Y w_yYY 的典型变量)

使得 Corr(u,v)\text{Corr}(u, v) 最大化。

在生物信息学研究中,经常需要分析不同分子层次之间的关联:

应用场景数据 XX数据 YY研究问题
基因调控基因表达甲基化水平甲基化如何影响表达
蛋白-RNA 关联RNA-seq蛋白质丰度转录后调控机制
多组学分型基因突变表达谱突变-表达关联的疾病亚型

关联发现:直接优化跨组学相关性,适合发现两组数据间的线性关联模式。

理论基础:CCA 是理解多模态学习、对比学习等现代方法的基础。CLIP 等模型的核心思想与 CCA 一脉相承。

可扩展性:可扩展到多组学(Group CCA)、非线性(Kernel CCA)、深度学习(Deep CCA)。

解释性:典型变量和权重具有明确的统计学解释,便于生物学解读。

虽然现代深度学习方法在灵活性上更强,但 CCA 仍然是:

  • 理解多组学关联分析的重要入门方法
  • 小样本场景下的稳健选择
  • 需要可解释性时的首选方案

对于两个标量变量 xxyy,Pearson 相关系数为:

\rho = \frac\{\text\{Cov\}(x, y)\}\{\sqrt\{\text\{Var\}(x) \text\{Var\}(y)\}\}

对于两组变量,CCA 寻找投影方向 wxw_xwyw_y,使得:

max{wx,wy}{wxTΣ{xy}wy}{{wxTΣ{xx}wxwyTΣ{yy}wy}}\max_\{w_x, w_y\} \frac\{w_x^T \Sigma_\{xy\} w_y\}\{\sqrt\{w_x^T \Sigma_\{xx\} w_x \cdot w_y^T \Sigma_\{yy\} w_y\}\}

其中:

  • Σxx=XTX\Sigma_{xx} = X^T XXX 的协方差矩阵
  • Σyy=YTY\Sigma_{yy} = Y^T YYY 的协方差矩阵
  • Σxy=XTY\Sigma_{xy} = X^T YXXYY 的交叉协方差矩阵
  • wxw_xwyw_y 是”权重向量”,告诉我们如何组合原始变量
  • u=Xwxu = X w_xv=Ywyv = Y w_y 是”典型变量”,代表两组数据的综合指标
  • CCA 找到使 uuvv 最相关的组合方式

CCA 的优化问题可以等价地写成:

max{wx,wy}wxTΣ{xy}wy\max_\{w_x, w_y\} w_x^T \Sigma_\{xy\} w_y

约束条件:

wxTΣ{xx}wx=1,wyTΣ{yy}wy=1w_x^T \Sigma_\{xx\} w_x = 1, \quad w_y^T \Sigma_\{yy\} w_y = 1

这个约束确保典型变量的方差为 1,避免平凡解。

CCA 可以找到多对典型变量 (u1,v1),(u2,v2),...,(ur,vr)(u_1, v_1), (u_2, v_2), ..., (u_r, v_r),其中 r=min(p,q)r = \min(p, q)

约束:

  • 不同对的典型变量之间互不相关:
    • Cov(ui,uj)=0\text{Cov}(u_i, u_j) = 0 for iji \neq j
    • Cov(vi,vj)=0\text{Cov}(v_i, v_j) = 0 for iji \neq j
  • 相关性递减:ρ1ρ2...ρr\rho_1 \geq \rho_2 \geq ... \geq \rho_r
典型相关系数 $ ho_k$
第 k 对典型变量之间的相关系数,衡量两组数据在第 k 个方向上的关联强度。
典型变量 $u_k, v_k$
通过线性组合得到的综合变量,代表了两组数据在某个关联方向上的投影。
权重向量 $w_x^{(k)}, w_y^{(k)}$
决定如何组合原始变量以得到典型变量的系数,可用于特征选择和解释。

算法1:数据标准化

输入:原始矩阵 X ∈ R^\{n×p\}, Y ∈ R^\{n×q\}
输出:标准化后的 X', Y'
1. 对 X:
a. 计算每列均值 μ_j = mean(X[:,j])
b. 计算每列标准差 σ_j = std(X[:,j])
c. X'[i,j] = (X[i,j] - μ_j) / σ_j
2. 对 Y:重复相同步骤
3. return X', Y'

算法2:计算协方差矩阵

输入:标准化后的 X, Y
输出:Σ_xx, Σ_yy, Σ_xy
1. Σ_xx = (X^T X) / (n-1)
2. Σ_yy = (Y^T Y) / (n-1)
3. Σ_xy = (X^T Y) / (n-1)
4. return Σ_xx, Σ_yy, Σ_xy

CCA 的求解可以转化为广义特征值问题:

\begin\{bmatrix\} 0 & \Sigma_\{xy\} \\ \Sigma_\{yx\} & 0 \end\{bmatrix\} \begin\{bmatrix\} w_x \\ w_y \end\{bmatrix\} = \rho \begin\{bmatrix\} \Sigma_\{xx\} & 0 \\ 0 & \Sigma_\{yy\} \end\{bmatrix\} \begin\{bmatrix\} w_x \\ w_y \end\{bmatrix\}

算法3:求解 CCA

输入:Σ_xx, Σ_yy, Σ_xy,典型变量对数 r
输出:权重矩阵 W_x, W_y,典型相关系数 ρ
1. 计算 M = Σ_xx^\{-1\} Σ_xy Σ_yy^\{-1\} Σ_yx
2. 求解 M 的特征值分解:
M w_x = λ w_x
得到特征值 λ_1 ≥ λ_2 ≥ ... ≥ λ_r 和特征向量 w_x^\{(1)\}, ..., w_x^\{(r)\}
3. 典型相关系数:ρ_k = sqrt(λ_k)
4. 计算对应的 w_y:
w_y^\{(k)\} = (1/ρ_k) Σ_yy^\{-1\} Σ_yx w_x^\{(k)\}
5. 组装权重矩阵:
W_x = [w_x^\{(1)\}, w_x^\{(2)\}, ..., w_x^\{(r)\}]
W_y = [w_y^\{(1)\}, w_y^\{(2)\}, ..., w_y^\{(r)\}]
6. return W_x, W_y, ρ

时间复杂度

  • 矩阵求逆:O(p3+q3)O(p^3 + q^3)
  • 特征值分解:O(p3)O(p^3)
  • 总计:O(p3+q3)O(p^3 + q^3)

算法4:计算典型变量

输入:X, Y, W_x, W_y
输出:典型变量 U, V
1. U = X @ W_x // n × r
2. V = Y @ W_y // n × r
3. return U, V

考虑两个组学数据:

  • 基因表达:3 个样本,2 个基因
  • 甲基化:3 个样本,2 个位点
X = \begin\{bmatrix\} 1 & 2 \\ 2 & 3 \\ 3 & 1 \end\{bmatrix\}, \quad Y = \begin\{bmatrix\} 2 & 1 \\ 3 & 2 \\ 1 & 3 \end\{bmatrix\}

假设已标准化(均值为 0,方差为 1):

X' = \begin\{bmatrix\} -1 & 0 \\ 0 & 1 \\ 1 & -1 \end\{bmatrix\}, \quad Y' = \begin\{bmatrix\} 0 & -1 \\ 1 & 0 \\ -1 & 1 \end\{bmatrix\} \Sigma_\{xx\} = \frac\{1\}\{2\} \begin\{bmatrix\} 2 & -1 \\ -1 & 2 \end\{bmatrix\} = \begin\{bmatrix\} 1 & -0.5 \\ -0.5 & 1 \end\{bmatrix\} \Sigma_\{yy\} = \frac\{1\}\{2\} \begin\{bmatrix\} 2 & -1 \\ -1 & 2 \end\{bmatrix\} = \begin\{bmatrix\} 1 & -0.5 \\ -0.5 & 1 \end\{bmatrix\} \Sigma_\{xy\} = \frac\{1\}\{2\} \begin\{bmatrix\} -1 & 1 \\ 1 & -1 \\ 0 & 0 \end\{bmatrix\}^T \begin\{bmatrix\} 0 & -1 \\ 1 & 0 \\ -1 & 1 \end\{bmatrix\} = \begin\{bmatrix\} -0.5 & 0.5 \\ 0.5 & -0.5 \end\{bmatrix\}

计算 Σxx1\Sigma_{xx}^{-1}

\Sigma_\{xx\}^\{-1\} = \frac\{1\}\{1 - 0.25\} \begin\{bmatrix\} 1 & 0.5 \\ 0.5 & 1 \end\{bmatrix\} = \begin\{bmatrix\} 1.33 & 0.67 \\ 0.67 & 1.33 \end\{bmatrix\}

计算 M=Σxx1ΣxyΣyy1ΣyxM = \Sigma_{xx}^{-1} \Sigma_{xy} \Sigma_{yy}^{-1} \Sigma_{yx}

由于 Σyy1=Σxx1\Sigma_{yy}^{-1} = \Sigma_{xx}^{-1}Σyx=ΣxyT\Sigma_{yx} = \Sigma_{xy}^T

M = \begin\{bmatrix\} 1.33 & 0.67 \\ 0.67 & 1.33 \end\{bmatrix\} \begin\{bmatrix\} -0.5 & 0.5 \\ 0.5 & -0.5 \end\{bmatrix\} \begin\{bmatrix\} 1.33 & 0.67 \\ 0.67 & 1.33 \end\{bmatrix\} \begin\{bmatrix\} -0.5 & 0.5 \\ 0.5 & -0.5 \end\{bmatrix\}

简化计算(省略中间步骤),得到特征值 λ1\lambda_1λ2\lambda_2

假设 λ1=0.64\lambda_1 = 0.64,则典型相关系数 ρ1=0.64=0.8\rho_1 = \sqrt{0.64} = 0.8

对应的特征向量 wx(1)w_x^{(1)}wy(1)w_y^{(1)} 给出第一对典型变量的权重。

  • 典型相关系数 0.8 表示两组数据在第一个方向上有较强的关联
  • 权重向量告诉我们哪些基因和甲基化位点对这种关联贡献最大
  • 协方差矩阵计算:O(np2+nq2)O(n p^2 + n q^2)
  • 矩阵求逆:O(p3+q3)O(p^3 + q^3)
  • 特征值分解:O(p3)O(p^3)
  • 总计:O(np2+nq2+p3+q3)O(n p^2 + n q^2 + p^3 + q^3)

n>p,qn > p, q 时,主导项是 O(np2+nq2)O(n p^2 + n q^2)

  • 存储协方差矩阵:O(p2+q2+pq)O(p^2 + q^2 + p q)
  • 存储权重矩阵:O(pr+qr)O(p r + q r)
  • 总计:O(p2+q2)O(p^2 + q^2)

在目标函数中加入 L1 正则项:

max{wx,wy}wxTΣ{xy}wyλxwx1λywy1\max_\{w_x, w_y\} w_x^T \Sigma_\{xy\} w_y - \lambda_x \|w_x\|_1 - \lambda_y \|w_y\|_1

优点

  • 实现特征选择
  • 提高可解释性
  • 适合高维数据

缺点

  • 优化更复杂
  • 需要调参

通过核函数处理非线性关系:

max{α,β}αTKxKyβ\max_\{\alpha, \beta\} \alpha^T K_x K_y \beta

约束:αTKx2α=1\alpha^T K_x^2 \alpha = 1βTKy2β=1\beta^T K_y^2 \beta = 1

其中 KxK_xKyK_y 是核矩阵。

优点

  • 捕捉非线性关系
  • 灵活性高

缺点

  • 计算复杂度高
  • 核函数选择影响结果

扩展到多组学(>2 组):

max{w1,...,wK}{i<j}wiTΣ{ij}wj\max_\{w_1, ..., w_K\} \sum_\{i < j\} w_i^T \Sigma_\{ij\} w_j

使用深度神经网络学习非线性映射:

max{f,g}{Corr}(f(X),g(Y))\max_\{f, g\} \text\{Corr\}(f(X), g(Y))

其中 ffgg 是深度网络。

  • 肘部法则:绘制典型相关系数,选择拐点
  • 显著性检验:使用 Wilks’ Lambda 检验
  • 解释性:选择能产生可解释结果的 r
  • 经验值:保留典型相关系数 > 0.3 的对
  • 交叉验证:在下游任务上交叉验证
  • 稳定性选择:多次运行,选择稳定的特征
  • BIC/AIC:使用信息准则
  • 两组匹配的样本数据
  • 寻找两组变量间的关联模式
  • 样本量相对充足(n > p + q)
  • 线性关系假设合理
  • 需要可解释的权重
  • 样本量不足(n < p + q)
  • 非线性关系强(考虑 Kernel CCA 或 Deep CCA)
  • 多于两组数据(考虑 Group CCA 或其他方法)
  • 需要处理缺失数据(考虑 MOFA+ 等贝叶斯方法)
  • 高维稀疏数据(考虑 Sparse CCA)
方法目标线性可解释性计算效率扩展性
CCA最大化相关
Sparse CCA最大化相关 + 稀疏很高
Kernel CCA最大化相关(非线性)
Deep CCA最大化相关(深度)
Joint NMF最小化重构误差
PLS最大化协方差
import numpy as np
from sklearn.cross_decomposition import CCA
from scipy.linalg import eigh
def canonical_correlation_analysis(X, Y, n_components=None):
"""
CCA 实现
参数:
X: 第一组数据(n_samples, n_features_x)
Y: 第二组数据(n_samples, n_features_y)
n_components: 典型变量对数,默认为 min(p, q)
返回:
W_x: X 的权重矩阵
W_y: Y 的权重矩阵
correlations: 典型相关系数
U: X 的典型变量
V: Y 的典型变量
"""
n, p = X.shape
_, q = Y.shape
if n_components is None:
n_components = min(p, q)
# 标准化
X = (X - X.mean(axis=0)) / X.std(axis=0)
Y = (Y - Y.mean(axis=0)) / Y.std(axis=0)
# 计算协方差矩阵
Sigma_xx = X.T @ X / (n - 1)
Sigma_yy = Y.T @ Y / (n - 1)
Sigma_xy = X.T @ Y / (n - 1)
# 使用 sklearn 的实现
cca = CCA(n_components=n_components)
cca.fit(X, Y)
U, V = cca.transform(X, Y)
W_x = cca.x_weights_
W_y = cca.y_weights_
# 计算典型相关系数
correlations = [np.corrcoef(U[:, i], V[:, i])[0, 1]
for i in range(n_components)]
return W_x, W_y, correlations, U, V
# 使用示例
X = np.random.randn(100, 50) # 100 样本,50 基因
Y = np.random.randn(100, 30) # 100 样本,30 甲基化位点
W_x, W_y, correlations, U, V = canonical_correlation_analysis(X, Y, n_components=5)
print(f"典型相关系数: \{correlations\}")
# 使用 CCA 包
library(CCA)
# 假设 X 和 Y 是数据矩阵
result <- cc(X, Y)
# 提取结果
canonical_correlations <- result$cor
x_weights <- result$xcoef
y_weights <- result$ycoef
canonical_vars_X <- result$scores$xscores
canonical_vars_Y <- result$scores$yscores
所属板块 分析方向与案例

把基础对象与算法方法重新放回真实分析任务与工作流。

阅读目标 帮助建立阅读上下文

先判断这页与你当前问题的关系,再决定是否深入展开。

建议前置 先建立相关基础对象与方法直觉

建议先建立相关基础对象与方法直觉,再进入本页。

检验典型相关系数是否显著不为零:

Wilks’ Lambda

Λ={i=1}{r}(1ρi2)\Lambda = \prod_\{i=1\}^\{r\} (1 - \rho_i^2)

转换为 F 统计量进行检验。

Bartlett 检验

基于 χ2\chi^2 分布的近似检验。

非参数方法,通过置换标签计算零分布。

现代对比学习(如 CLIP)的思想与 CCA 相关:

  • CCA:最大化线性组合的相关性
  • 对比学习:最大化神经网络输出的相似度

Deep CCA 是多模态深度学习的早期方法,影响了后续的:

  • 多模态自编码器
  • 跨模态检索
  • 联合表示学习
  • Hotelling, H. (1936). “Relations between two sets of variates”
  • Hardoon, D. R., et al. (2004). “Canonical Correlation Analysis: An Overview with Application to Learning Methods”
  • Witten, D. M., et al. (2009). “A penalized matrix decomposition, with applications to sparse principal components and canonical correlation analysis”
  • Andrew, G., et al. (2013). “Deep Canonical Correlation Analysis”