/ / /
第36讲:主成分分析 (Principal Component Analysis)
🔴
入学要求
💯
能力测试
🛣️
课程安排
🕹️
研究资源

第36讲:主成分分析 (Principal Component Analysis)

💡

查看全集:💎Quantopia量化分析56讲

一、PCA基础概念

1.1 什么是PCA?

主成分分析(PCA)是一种降维技术,通过线性变换将高维数据投影到低维空间,同时保留最大方差。想象你要给朋友描述一张复杂图片,你会先抓住主要特征(形状、颜色分布),PCA就是帮我们找出这些"主要特征"的数学工具。

1.2 关键数学公式

小知识:特征值大小反映主成分的重要性,越大说明该方向方差越大

二、图像处理实例

2.1 生成测试图像

import numpy as np
import matplotlib.pyplot as plt

def generate_test_image(m, n):
    X = np.zeros((m, n))
    # 添加几何图形(代码与原文相同)
    return X

X = generate_test_image(200, 200)
plt.imshow(X, cmap='gray')

2.2 执行PCA

# 计算协方差矩阵
C = np.cov(X)
# 特征分解
eigenvalues, eigenvectors = np.linalg.eigh(C)
# 按特征值降序排列
idx = eigenvalues.argsort()[::-1]
eigenvalues = eigenvalues[idx]
eigenvectors = eigenvectors[:, idx]

2.3 图像重构对比

def reconstruct_image(k, eigenvectors, X):
    components = eigenvectors[:, :k]
    return components @ (components.T @ X)

fig, axs = plt.subplots(2, 2, figsize=(10,10))
for i, k in enumerate([10, 20, 30, 60]):
    ax = axs[i//2, i%2]
    ax.imshow(reconstruct_image(k, eigenvectors, X), cmap='gray')
    ax.set_title(f'k={k}')
练习:尝试不同k值观察图像质量变化,记录各k值对应的方差保留比例

三、金融投资组合分析

3.1 数据获取与预处理

import yfinance as yf

symbols = ['IBM', 'MSFT', 'FB', 'T', 'INTC', 'ABX', 'NEM', 'AU', 'AEM', 'GFI']
data = yf.download(symbols, start='2015-09-01', end='2016-11-01')['Adj Close']
returns = data.pct_change().dropna()

3.2 主成分分析

from sklearn.decomposition import PCA

pca = PCA(n_components=2)
factors = pca.fit_transform(returns)

print(f"解释方差比例: {pca.explained_variance_ratio_}")
# 典型输出: [0.65, 0.15] 表示前两个主成分解释80%方差

3.3 结果可视化

plt.figure(figsize=(10,6))
plt.scatter(factors[:,0], factors[:,1], c=returns.index.dayofweek)
plt.xlabel('Factor 1')
plt.ylabel('Factor 2')
plt.colorbar(label='Day of Week')

四、进阶应用

4.1 特征工程应用

将主成分作为新特征输入到机器学习模型,可有效降低维度灾难风险

4.2 注意事项

对比分析:尝试对有/无标准化的数据分别进行PCA,观察特征值分布差异

五、总结与练习

5.1 关键点总结

  1. PCA通过线性变换寻找最大方差方向
  1. 主成分个数选择取决于累计方差贡献率
  1. 在金融中可用于风险因子提取和降维

5.2 综合练习

使用yfinance获取中国A股10只股票数据:

  1. 计算日收益率并进行PCA
  1. 绘制前两个主成分的散点图
  1. 比较不同行业股票在主成分空间中的分布
# 练习参考答案框架
symbols_cn = ['600519.SS', '000001.SZ', ...] # 填入实际股票代码
data_cn = yf.download(symbols_cn, ...)
# 自行补充完整分析代码

通过本教程,您应该能够掌握PCA的核心思想,并在实际数据分析中灵活应用。当处理高维数据时,记得将PCA作为您的"数据望远镜",帮助您洞察复杂数据背后的主要结构!

附:练习合集