Day 16:PCA主成分分析与降维

Day 16:PCA主成分分析与降维

📋 目录

  1. 降维概述
  2. PCA数学原理
  3. 主成分的可解释性
  4. 主成分数量的选择
  5. 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)

  1. 数据中心化: X c = X − μ X_c = X - μ Xc=X−μ (每个特征减去均值)

  2. 计算协方差矩阵: Σ = ( 1 / ( n − 1 ) ) X c T X c \Sigma = (1/(n-1)) X_c^T X_c Σ=(1/(n−1))XcTXc

  3. 特征分解 Σ \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

  4. 选择前 k k k 个特征向量组成投影矩阵 W = [ v 1 , v 2 , . . . , v k ] W = [v_1, v_2, ..., v_k] W=[v1,v2,...,vk]

  5. 投影: 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 特征选择
输出 新特征(组合) 原始特征子集
可解释性
维度降低 可大幅降低 有限
信息保留 保留方差信息 可能丢失交互信息
相关推荐
昇腾CANN2 小时前
4月28日直播丨基于TorchTitan的DeepSeek-V4昇腾续训练优化实践
人工智能·昇腾·cann·deepseek
熬夜敲代码的猫2 小时前
C++继承:让你从入门到深入
c++·算法·继承
jackyrongvip2 小时前
快速理解本体论
人工智能·本体论
人工智能AI技术2 小时前
Python 常见内置异常类型大全
人工智能
人道领域2 小时前
【LeetCode刷题日记】239.滑动窗口最大值:单调队列解法(困难)
java·开发语言·算法
Irissgwe2 小时前
优选算法精讲(专题一)
数据结构·算法
wuxinyan1232 小时前
Java面试题53:一文深入了解RAG(检索增强生成)核心概念
java·人工智能·机器学习·面试·rag
睡觉就不困鸭2 小时前
第十五天 反转字符串
数据结构·算法
果汁华2 小时前
Claude Agent SDK Python:构建自主 AI 代理的官方引擎
开发语言·人工智能·python