一、PCA基础概念#
1.1 什么是PCA?#
主成分分析(PCA)是一种降维技术,通过线性变换将高维数据投影到低维空间,同时保留最大方差。想象你要给朋友描述一张复杂图片,你会先抓住主要特征(形状、颜色分布),PCA就是帮我们找出这些"主要特征"的数学工具。
1.2 关键数学公式#
-
协方差矩阵:对于中心化后的数据矩阵X,协方差矩阵
-
特征分解:,其中Λ为特征值对角矩阵,P为特征向量矩阵
-
主成分:第k个主成分 (为第k个特征向量)
小知识:特征值大小反映主成分的重要性,越大说明该方向方差越大
二、图像处理实例#
2.1 生成测试图像#
code
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#
code
# 计算协方差矩阵
C = np.cov(X)
# 特征分解
eigenvalues, eigenvectors = np.linalg.eigh(C)
# 按特征值降序排列
idx = eigenvalues.argsort()[::-1]
eigenvalues = eigenvalues[idx]
eigenvectors = eigenvectors[:, idx]2.3 图像重构对比#
code
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 数据获取与预处理#
code
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 主成分分析#
code
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 结果可视化#
code
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 注意事项#
-
数据标准化:不同量纲特征需先标准化(z-score)
-
过拟合风险:主成分过多可能导致模型过拟合
-
解释性:主成分的物理意义需要结合业务理解
对比分析:尝试对有/无标准化的数据分别进行PCA,观察特征值分布差异
五、总结与练习#
5.1 关键点总结#
-
PCA通过线性变换寻找最大方差方向
-
主成分个数选择取决于累计方差贡献率
-
在金融中可用于风险因子提取和降维
5.2 综合练习#
使用yfinance获取中国A股10只股票数据:
-
计算日收益率并进行PCA
-
绘制前两个主成分的散点图
-
比较不同行业股票在主成分空间中的分布
code
# 练习参考答案框架
symbols_cn = ['600519.SS', '000001.SZ', ...] # 填入实际股票代码
data_cn = yf.download(symbols_cn, ...)
# 自行补充完整分析代码通过本教程,您应该能够掌握PCA的核心思想,并在实际数据分析中灵活应用。当处理高维数据时,记得将PCA作为您的"数据望远镜",帮助您洞察复杂数据背后的主要结构!