2. 线性代数基础
在因子正交化与PCA共线性处理中,几乎所有操作最终都会落到线性代数的几个核心概念上。很多人在调用np.linalg.svd或sklearn.decomposition.PCA时能跑通代码,却无法解释为什么因子载荷会变成负值、为什么主成分得分与原始因子方向相反、为什么某些特征值接近零。本章不追求数学证明的完备性,而是围绕实战中真正会用到的概念,建立一套可操作的几何直觉。
一、核心原理:从向量到投影的几何链条
向量是因子数据的原子单位。一个因子在N个样本上的取值,就是一个N维向量。两个因子的关系,本质上就是两个向量的夹角关系。内积定义为:
dot(a, b) = Σ a_i * b_i = ||a|| * ||b|| * cos(θ)
当内积为零时,两向量正交,对应因子之间线性无关。当内积绝对值接近模长乘积时,两向量几乎共线,对应因子高度共线。这就是共线性问题的几何本质。
矩阵则是多个因子向量的排列。若数据矩阵X的形状为N×P,则X的每一列是一个因子,每一行是一个样本。矩阵的秩rank(X)表示其中线性无关的列向量的最大个数。如果rank(X) < P,说明存在至少一个因子可以由其他因子线性组合表示,设计矩阵不满秩,回归系数不唯一,方差膨胀因子趋于无穷。
特征值与特征向量描述的是矩阵在特定方向上的“伸缩行为”。对于方阵A,若存在非零向量v和标量λ满足:
A v = λ v
则v是A的特征向量,λ是对应的特征值。在PCA中,我们真正关心的是协方差矩阵C = XᵀX / (N-1)的特征分解。特征值λ_i表示第i个主成分方向上的方差大小,特征向量v_i表示该主成分的方向。特征值越大,说明数据在该方向上的信息量越丰富;特征值接近零,说明该方向上的变异几乎被噪声主导,对应原始因子的某个线性组合近似为常数。
实战映射:条件数cond(X) = σ_max / σ_min,其中σ为奇异值。当cond(X) > 30时,共线性开始显著;当cond(X) > 1000时,数值计算极不稳定。PCA通过丢弃小奇异值对应的方向,本质上是在降低条件数。
二、方法流程:正交化与投影的操作逻辑
正交化的目标是构造一组两两正交的新基,使得原始因子在新基上的表示不再冗余。最经典的流程是Gram-Schmidt正交化,其步骤为:
- 取第一个因子向量v1,归一化得到u1。
- 取第二个因子向量v2,减去其在u1上的投影分量:v2' = v2 - (v2·u1)u1,再归一化得到u2。
- 对第k个因子,减去其在前k-1个已正交化向量上的所有投影分量,再归一化。
投影公式为proj_u(v) = (v·u / u·u) u。在因子分析中,投影的残差就是剔除共同线性信息后剩下的“纯净”部分。PCA则走另一条路:不逐个正交化,而是直接对协方差矩阵做特征分解,一次性得到全部正交主成分。两者数学上等价,但PCA在数值稳定性和方差解释上更优。
实际工程中,更常用SVD分解代替特征分解,因为SVD不需要显式计算协方差矩阵,数值精度更高:
X = U S Vᵀ
主成分得分 = U S
主成分方向 = V
方差解释率 = S² / Σ S²
三、案例场景:三个共线因子的PCA处理
假设我们构造三个因子:f1为随机噪声,f2 = 0.9 f1 + 0.1 noise,f3 = 0.8 f1 + 0.2 noise。显然f1、f2、f3高度共线。直接做线性回归会得到巨大的系数和标准误。使用PCA后,第一主成分解释了约99%的方差,第二、第三主成分特征值接近零。
| 主成分 | 特征值 | 方差解释率 | 累计解释率 | 处理决策 |
|---|---|---|---|---|
| PC1 | 2.87 | 95.7% | 95.7% | 保留 |
| PC2 | 0.11 | 3.7% | 99.4% | 观察 |
| PC3 | 0.02 | 0.6% | 100% | 丢弃 |
此时若保留PC1和PC2,原始三个因子的信息被压缩为两个正交维度,共线性被消除。但需要注意:主成分是原始因子的线性组合,解释性会下降。在因子归因场景中,需要将主成分系数映射回原始因子,才能回答“哪个因子贡献最大”。
操作建议:在PCA之前务必对因子做标准化(z-score),否则量纲大的因子会主导主成分方向。标准化后协方差矩阵等于相关系数矩阵,特征值之和等于因子个数。
四、误区与复盘:正交化不等于信息无损
最常见的误区是认为正交化后因子之间完全独立,因此可以随意解释。实际上,正交化只是消除了线性相关,非线性相关依然存在。此外,Gram-Schmidt正交化对因子顺序敏感:先进入的因子保留原始方向,后进入的因子被投影残差替代,导致结果不可交换。PCA虽然顺序无关,但主成分方向的正负号在数值实现中可能翻转,需要统一符号才能稳定复现。
另一个高频错误是直接对原始数据矩阵做特征分解。特征分解只适用于方阵,而数据矩阵通常是N×P的长方阵。正确做法是对协方差矩阵或相关系数矩阵做特征分解,或直接使用SVD。若误用np.linalg.eig(X),会得到复数特征值或无意义结果。
复盘清单:①检查条件数是否超过30;②确认标准化已完成;③确认使用SVD或协方差矩阵特征分解;④检查特征值是否出现负值(数值误差导致);⑤统一主成分符号;⑥保留主成分个数需结合累计方差解释率和业务可解释性,而非机械取特征值大于1。