2.4 特征值分解与 SVD
特征值和奇异值是数据背后"最重要的方向"。PCA 降维、风险分解、因子模型都靠它。
一、特征值与特征向量
1.1 什么是特征值
一个矩阵 作用于一个向量 ,通常结果会改变方向。但有一些"特殊方向", 作用上去只会拉长或缩短,方向不变。
满足这个式子的 叫特征值, 叫特征向量。
1.2 手算
。
先求特征值:
再求特征向量:
:解
取 (方向相同的一组)。
:解
取 。
验证: ✅
1.3 特征值分解
将特征向量和特征值写成矩阵形式:
如果 是对称矩阵(如协方差矩阵), 还是正交矩阵(Orthogonal Matrix):行和列都是单位长度且两两正交的矩阵,即 ,因此 :
Quant Link:PCA = 对协方差矩阵做特征值分解。 是最大特征值,对应"数据波动最大的方向"(第一主成分)。 次之(第二主成分,与第一主成分正交)。 在利率曲线风险分解中,前三个主成分通常能解释 95% 以上的变动:PC1(水平平移 ~70%)、PC2(倾斜 ~20%)、PC3(曲率 ~5%)。
二、奇异值分解 (SVD)
2.1 特征值分解的局限
特征值分解只能用于方阵。但很多时候你的数据矩阵 是 的( 个样本, 个特征),不是方阵。SVD 对此做了推广。
2.2 定义
任意 矩阵 都可以分解为:
其中 、 是正交矩阵, 是对角矩阵(对角线上的 称为奇异值)。
2.3 SVD 和特征值的关系
的奇异值 ,其中 是 的特征值。因此 SVD 是"方阵特征值分解的推广"。
2.4 关键应用
低秩近似(≈ 数据压缩):只保留前 个最大的奇异值,丢掉后面的。这就是 PCA 降维的本质。
伪逆(Pseudoinverse / Moore-Penrose inverse):当 不可逆(不是方阵或奇异)时,伪逆是逆矩阵的推广,满足 。SVD 可用来计算伪逆 。
python
import numpy as np
# 特征值分解
A = np.array([[2, 1], [1, 2]])
eigvals, eigvecs = np.linalg.eig(A)
print(f"特征值: {eigvals}") # [3, 1]
print(f"特征向量:\n{eigvecs}")
# SVD
A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
U, s, Vt = np.linalg.svd(A)
print(f"\n奇异值: {s}")
# PCA 示例——计算方差解释比例
np.random.seed(42)
data = np.random.randn(100, 5)
U, s, Vt = np.linalg.svd(data - data.mean(axis=0), full_matrices=False)
var_exp = s**2 / np.sum(s**2)
for i, v in enumerate(var_exp):
print(f" PC{i+1}: {v:.2%}(累计: {var_exp[:i+1].sum():.2%})")\n> 下一步:继续学习 2.5 PCA