Skip to content

2.4 特征值分解与 SVD

特征值和奇异值是数据背后"最重要的方向"。PCA 降维、风险分解、因子模型都靠它。


一、特征值与特征向量

1.1 什么是特征值

一个矩阵 AA 作用于一个向量 v\boldsymbol{v},通常结果会改变方向。但有一些"特殊方向",AA 作用上去只会拉长或缩短,方向不变。

Av=λvA \boldsymbol{v} = \lambda \boldsymbol{v}

满足这个式子的 λ\lambda特征值v\boldsymbol{v}特征向量

1.2 手算

A=[2112]A = \begin{bmatrix} 2 & 1 \\ 1 & 2 \end{bmatrix}

先求特征值

det(AλI)=det[2λ112λ]=(2λ)21=0\det(A - \lambda I) = \det\begin{bmatrix} 2-\lambda & 1 \\ 1 & 2-\lambda \end{bmatrix} = (2-\lambda)^2 - 1 = 0

(2λ)2=12λ=±1λ1=3,  λ2=1(2-\lambda)^2 = 1 \quad\Rightarrow\quad 2-\lambda = \pm 1 \quad\Rightarrow\quad \lambda_1 = 3,\; \lambda_2 = 1

再求特征向量

λ1=3\lambda_1 = 3:解 (A3I)v=0(A - 3I)\boldsymbol{v} = \boldsymbol{0}

[1111][v1v2]=[00]v1+v2=0v1=v2\begin{bmatrix} -1 & 1 \\ 1 & -1 \end{bmatrix} \begin{bmatrix} v_1 \\ v_2 \end{bmatrix} = \begin{bmatrix} 0 \\ 0 \end{bmatrix} \quad\Rightarrow\quad -v_1 + v_2 = 0 \quad\Rightarrow\quad v_1 = v_2

v1=[11]\boldsymbol{v}_1 = \begin{bmatrix} 1 \\ 1 \end{bmatrix}(方向相同的一组)。

λ2=1\lambda_2 = 1:解 (AI)v=0(A - I)\boldsymbol{v} = \boldsymbol{0}

[1111][v1v2]=[00]v1+v2=0v1=v2\begin{bmatrix} 1 & 1 \\ 1 & 1 \end{bmatrix} \begin{bmatrix} v_1 \\ v_2 \end{bmatrix} = \begin{bmatrix} 0 \\ 0 \end{bmatrix} \quad\Rightarrow\quad v_1 + v_2 = 0 \quad\Rightarrow\quad v_1 = -v_2

v2=[11]\boldsymbol{v}_2 = \begin{bmatrix} 1 \\ -1 \end{bmatrix}

验证:Av1=[2112][11]=[33]=3[11]A\boldsymbol{v}_1 = \begin{bmatrix}2&1\\1&2\end{bmatrix}\begin{bmatrix}1\\1\end{bmatrix} = \begin{bmatrix}3\\3\end{bmatrix} = 3\begin{bmatrix}1\\1\end{bmatrix}

1.3 特征值分解

将特征向量和特征值写成矩阵形式:

A=QΛQ1,Q=[v1,v2],  Λ=[λ100λ2]A = Q \Lambda Q^{-1}, \quad Q = [\boldsymbol{v}_1, \boldsymbol{v}_2], \; \Lambda = \begin{bmatrix} \lambda_1 & 0 \\ 0 & \lambda_2 \end{bmatrix}

如果 AA 是对称矩阵(如协方差矩阵),QQ 还是正交矩阵(Orthogonal Matrix):行和列都是单位长度且两两正交的矩阵,即 QTQ=IQ^T Q = I,因此 Q1=QTQ^{-1} = Q^T

A=QΛQTA = Q \Lambda Q^T

Quant LinkPCA = 对协方差矩阵做特征值分解λ1\lambda_1 是最大特征值,对应"数据波动最大的方向"(第一主成分)。λ2\lambda_2 次之(第二主成分,与第一主成分正交)。 在利率曲线风险分解中,前三个主成分通常能解释 95% 以上的变动:PC1(水平平移 ~70%)、PC2(倾斜 ~20%)、PC3(曲率 ~5%)。


二、奇异值分解 (SVD)

2.1 特征值分解的局限

特征值分解只能用于方阵。但很多时候你的数据矩阵 XXm×nm \times n 的(mm 个样本,nn 个特征),不是方阵。SVD 对此做了推广。

2.2 定义

任意 m×nm \times n 矩阵 AA 都可以分解为:

A=UΣVTA = U \Sigma V^T

其中 UUVV 是正交矩阵,Σ\Sigma 是对角矩阵(对角线上的 σi\sigma_i 称为奇异值)。

2.3 SVD 和特征值的关系

AA 的奇异值 σi=λi\sigma_i = \sqrt{\lambda_i},其中 λi\lambda_iATAA^T A 的特征值。因此 SVD 是"方阵特征值分解的推广"。

2.4 关键应用

低秩近似(≈ 数据压缩):只保留前 kk 个最大的奇异值,丢掉后面的。这就是 PCA 降维的本质。

伪逆(Pseudoinverse / Moore-Penrose inverse):当 AA 不可逆(不是方阵或奇异)时,伪逆是逆矩阵的推广,满足 AA+A=AA A^+ A = A。SVD 可用来计算伪逆 A+=VSigma+UTA^+ = V \\Sigma^+ U^T

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

Built with VitePress