Day 16:PCA主成分分析与降维
📋 目录
- 降维概述
- PCA数学原理
- 主成分的可解释性
- 主成分数量的选择
- PCA在量化中的应用
第一部分:降维概述(1.5小时理论)
1.1 为什么需要降维?
维度灾难:
- 随着特征维度增加,数据点变得稀疏
- 距离度量失效
- 需要指数级增长的样本量
降维的好处:
| 好处 | 说明 |
|---|---|
| 减少过拟合 | 降低模型复杂度 |
| 提高速度 | 减少计算量 |
| 去除噪声 | 过滤冗余信息 |
| 可视化 | 高维数据投影到2D/3D |
| 内存节省 | 存储更少特征 |
1.2 降维方法分类
| 类型 | 方法 | 特点 |
|---|---|---|
| 线性 | PCA、LDA | 假设线性结构,速度快 |
| 非线性 | t-SNE、UMAP | 捕捉非线性,计算慢 |
| 流形学习 | Isomap、LLE | 保持局部结构 |
| 特征选择 | 方差阈值、互信息 | 选择子集,可解释 |
1.3 PCA的核心思想
PCA(主成分分析) :通过线性变换,将原始特征投影到方差最大的新坐标系上。
目标:找到一组新的正交基(主成分),使得:
- 第一主成分:数据方差最大方向
- 第二主成分:与第一正交且方差次大
- 依此类推...
第二部分:PCA数学原理
2.1 最大方差解释
直觉:方差大的方向包含更多信息,方差小的方向可能是噪声。
数学推导 :寻找单位向量 w w w,使投影 X w Xw Xw 的方差最大:
max w Var ( X w ) = max w w T Σ w s.t. ∥ w ∥ = 1 \max_{w} \operatorname{Var}(Xw) = \max_{w} w^T \Sigma w \quad \text{s.t.} \quad \|w\| = 1 wmaxVar(Xw)=wmaxwTΣws.t.∥w∥=1
其中 Σ = 1 n X T X \Sigma = \frac{1}{n}X^TX Σ=n1XTX 是协方差矩阵。
解 : w w w 是 Σ \Sigma Σ 的最大特征值对应的特征向量。
2.2 协方差矩阵与特征分解
协方差矩阵 :表示特征之间的相关性。
Σ = 1 n − 1 ( X − X ˉ ) T ( X − X ˉ ) \Sigma = \frac{1}{n-1}(X - \bar{X})^T(X - \bar{X}) Σ=n−11(X−Xˉ)T(X−Xˉ)
特征分解 :
Σ v i = λ i v i \Sigma v_i = \lambda_i v_i Σvi=λivi
其中:
- λ i \lambda_i λi:特征值,表示该主成分的方差大小
- v i v_i vi:特征向量,表示主成分方向
2.3 PCA计算步骤
输入 :数据矩阵 X X X ( n × p ) (n×p) (n×p),目标维度 k k k
输出 :降维后的数据 Y Y Y ( n × k ) (n×k) (n×k)
-
数据中心化: X c = X − μ X_c = X - μ Xc=X−μ (每个特征减去均值)
-
计算协方差矩阵: Σ = ( 1 / ( n − 1 ) ) X c T X c \Sigma = (1/(n-1)) X_c^T X_c Σ=(1/(n−1))XcTXc
-
特征分解 Σ \Sigma Σ 得到特征值 λ 1 ≥ λ 2 ≥ ⋯ ≥ λ p λ_1 ≥ λ_2 ≥ \cdots ≥ λ_p λ1≥λ2≥⋯≥λp 和特征向量 v 1 , v 2 , ⋯ , v p v_1, v_2, \cdots , v_p v1,v2,⋯,vp
-
选择前 k k k 个特征向量组成投影矩阵 W = [ v 1 , v 2 , . . . , v k ] W = [v_1, v_2, ..., v_k] W=[v1,v2,...,vk]
-
投影: Y = X c ⋅ W Y = X_c \cdot W Y=Xc⋅W
2.4 方差解释比例
单个主成分方差解释率 :
解释 率 i = λ i ∑ j = 1 p λ j 解释率_i = \cfrac {λ_i} {∑_{j=1}^p λ_j} 解释率i=∑j=1pλjλi
累积方差解释率 :
累积解释 率 k = ∑ i = 1 k λ i ∑ j = 1 p λ j 累积解释率_k = \cfrac {\sum_{i=1}^k λ_i} {\sum_{j=1}^pλ_j} 累积解释率k=∑j=1pλj∑i=1kλi
第三部分:主成分的可解释性
3.1 载荷(Loadings)
载荷:原始特征与主成分之间的相关系数。
python
# 载荷矩阵
loadings = pca.components_.T # shape: (n_features, n_components)
# 每个主成分最重要的原始特征
for i in range(n_components):
top_features = np.argsort(np.abs(loadings[:, i]))[-5:][::-1]
print(f"PC{i+1} 最重要的特征: {feature_names[top_features]}")
3.2 载荷的正负含义
| 载荷符号 | 含义 |
|---|---|
| 正载荷 | 原始特征与主成分正相关 |
| 负载荷 | 原始特征与主成分负相关 |
示例:
- PC1 载荷:PE(0.6), PB(0.5), ROE(-0.4)
- 解释:PC1 代表"估值维度"
3.3 主成分命名
根据载荷较大的原始特征,可以为主成分赋予业务含义:
| 主成分 | 高载荷特征 | 可解释为 |
|---|---|---|
| PC1 | PE↑, PB↑, ROE↓ | 估值因子 |
| PC2 | 换手率↑, 波动率↑ | 流动性因子 |
| PC3 | 动量指标↑ | 动量因子 |
第四部分:主成分数量的选择
4.1 累积方差解释率
常见标准:
- 保留足够解释全部方差的95%
- 保留足够解释全部方差的90%
- 保留特征值 > 1 的主成分
python
# 找到达到95%方差的成分数
cumsum = np.cumsum(pca.explained_variance_ratio_)
n_components_95 = np.argmax(cumsum >= 0.95) + 1
4.2 肘部法则(Scree Plot)
绘制特征值从小到大的曲线,找到"肘点":
python
plt.plot(range(1, len(eigenvalues)+1), eigenvalues, 'bo-')
plt.xlabel('主成分编号')
plt.ylabel('特征值')
plt.title('Scree Plot(肘部法则)')
4.3 交叉验证
使用模型性能作为选择依据:
python
from sklearn.model_selection import cross_val_score
for k in range(1, 21):
pca = PCA(n_components=k)
X_pca = pca.fit_transform(X_scaled)
score = cross_val_score(model, X_pca, y, cv=5).mean()
scores.append(score)
4.4 选择方法对比
| 方法 | 优点 | 缺点 |
|---|---|---|
| 累积方差 | 简单快速 | 阈值主观 |
| Scree Plot | 可视化直观 | 肘点可能不明显 |
| 交叉验证 | 面向任务 | 计算量大 |
第五部分:PCA在量化中的应用
5.1 典型应用场景
| 应用 | 说明 |
|---|---|
| 因子降维 | 将多个相关因子合并为少数主成分 |
| 风险模型 | 识别主要风险来源 |
| 数据预处理 | 减少模型输入维度 |
| 可视化 | 高维数据投影到2D/3D |
| 异常检测 | 重构误差大的点是异常 |
5.2 PCA的局限性
| 局限性 | 说明 | 解决方案 |
|---|---|---|
| 线性假设 | 只能捕捉线性关系 | 使用核PCA |
| 可解释性差 | 主成分是原始特征的线性组合 | 分析载荷矩阵 |
| 受量纲影响 | 需标准化 | 使用StandardScaler |
| 对异常值敏感 | 异常值影响方差 | 使用RobustPCA |
5.3 PCA vs 特征选择
| 方法 | PCA | 特征选择 |
|---|---|---|
| 输出 | 新特征(组合) | 原始特征子集 |
| 可解释性 | 差 | 好 |
| 维度降低 | 可大幅降低 | 有限 |
| 信息保留 | 保留方差信息 | 可能丢失交互信息 |