跳到正文

特征值与特征向量

矩阵的特征向量是矩阵变换时方向不变的向量——只是缩放。特征值告诉你缩放了多少。它们是 PCA、因子模型和马尔可夫链的基础。

第 3 篇 · 共 6 篇 约 3 分钟

什么是特征向量

当矩阵 A\mathbf{A} 乘以向量 v\mathbf{v} 时,它会变换该向量——旋转、拉伸或压缩。特征向量是一种特殊向量,它在变换中不会被旋转。它只会缩放。

Av=λv\mathbf{A}\mathbf{v} = \lambda \mathbf{v}

其中 v\mathbf{v} 是特征向量,λ\lambda 是特征值——特征向量被拉伸或压缩的因子。如果 λ=2\lambda = 2,特征向量的长度翻倍。如果 λ=−0.5\lambda = -0.5,它翻转方向且长度减半。

“eigen” 一词来自德语,意思是”自己的”或”特有的”。特征向量是矩阵的”固有”方向,是矩阵固有的,而非任意的。

求特征值

方程 Av=λv\mathbf{A}\mathbf{v} = \lambda \mathbf{v} 可以改写为:

(A−λI)v=0(\mathbf{A} - \lambda\mathbf{I})\mathbf{v} = \mathbf{0}

对于非零 v\mathbf{v} 要满足此条件,矩阵 (A−λI)(\mathbf{A} - \lambda\mathbf{I}) 必须是奇异的——它的行列式必须为零。这给出了特征方程:

det⁡(A−λI)=0\det(\mathbf{A} - \lambda\mathbf{I}) = 0

解这个方程得到特征值。然后将每个特征值代回以找到其对应的特征向量。

对于 2×22 \times 2 矩阵,特征方程是二次的,你可以手解。对于更大的矩阵,数值软件是必不可少的。

特征分解

一旦你有了 n×nn \times n 矩阵 A\mathbf{A} 的所有 nn 个特征值和特征向量,你可以写成:

A=QΛQ−1\mathbf{A} = \mathbf{Q}\mathbf{\Lambda}\mathbf{Q}^{-1}

其中 Q\mathbf{Q} 是其列为特征向量的矩阵,Λ\mathbf{\Lambda} 是对角线上为特征值的对角矩阵:

Λ=[λ10⋯0λ2⋯⋮⋮⋱]\mathbf{\Lambda} = \begin{bmatrix} \lambda_1 & 0 & \cdots \\ 0 & \lambda_2 & \cdots \\ \vdots & \vdots & \ddots \end{bmatrix}

这就是 A\mathbf{A} 的特征分解。

对于对称矩阵——协方差矩阵总是对称的——特征向量相互正交,这意味着 Q−1=Q⊤\mathbf{Q}^{-1} = \mathbf{Q}^\top。这大大简化了分解:

A=QΛQ⊤\mathbf{A} = \mathbf{Q}\mathbf{\Lambda}\mathbf{Q}^\top

特征值的性质

几个关系将特征值与矩阵的其他性质联系起来:

迹(对角线元素之和)等于特征值之和:

tr(A)=∑i=1nλi\text{tr}(\mathbf{A}) = \sum_{i=1}^{n} \lambda_i

行列式等于特征值的乘积:

det⁡(A)=∏i=1nλi\det(\mathbf{A}) = \prod_{i=1}^{n} \lambda_i

对称矩阵总是有实特征值。 复数特征值需要振荡行为——旋转向量而非仅仅缩放。协方差矩阵按定义是对称的,从不旋转向量。它的特征值始终是实数。

正定矩阵的所有特征值都大于零。协方差矩阵是半正定的(所有特征值 ≥0\geq 0),如果没有任何资产是其他资产的完美线性组合,则是正定的。

用 Python 计算

import numpy as np


Sigma = np.array([[1.0, 0.5, 0.3],
                  [0.5, 1.0, 0.4],
                  [0.3, 0.4, 1.0]])

# 对于对称矩阵,使用 eigh(数值更稳定)
eigenvalues, eigenvectors = np.linalg.eigh(Sigma)

# 特征值按升序排列
print("特征值:", eigenvalues)
print("特征向量(列):\n", eigenvectors)

# 验证:A @ v = lambda * v
for i in range(3):
    lam = eigenvalues[i]
    v = eigenvectors[:, i]
    lhs = Sigma @ v
    rhs = lam * v
    print(f"特征值 {i}: {np.allclose(lhs, rhs)}")

提示词

用 numpy.linalg.eigh 算 3×3 对称矩阵的特征值和特征向量,用 np.allclose 验证 A@v = λv。

对于非对称矩阵,使用 np.linalg.eig 而不是 np.linalg.eigh。非对称版本可能返回复数特征值,你需要以不同方式处理。

应用:PCA 和方差分解

在关于主成分分析(PCA)的文章中,你将看到特征值被立即投入使用。给定资产收益率的协方差矩阵,特征值告诉你每个主成分捕获了多少总方差。

因为协方差矩阵是对称半正定的:

  • 每个特征值 λi≥0\lambda_i \geq 0
  • 所有特征值之和等于总方差(Σ\Sigma 的迹)
  • 分数 λi/∑jλj\lambda_i / \sum_j \lambda_j 是第 ii 个成分解释的总方差比例

在实践中,一个 500 资产协方差矩阵可能 95% 的方差集中在前 20 个特征值中。其余 480 个特征值接近于零——这是不有意义描述投资组合如何运动的噪声。这就是 PCA 实现降维的方式。

import numpy as np

# 模拟的 5 资产协方差矩阵
Sigma = np.array([[1.00, 0.80, 0.40, 0.20, 0.10],
                  [0.80, 1.00, 0.50, 0.30, 0.15],
                  [0.40, 0.50, 1.00, 0.60, 0.25],
                  [0.20, 0.30, 0.60, 1.00, 0.70],
                  [0.10, 0.15, 0.25, 0.70, 1.00]])

eigenvalues, _ = np.linalg.eigh(Sigma)

# 降序排列(eigh 返回升序)
eigenvalues = eigenvalues[::-1]

# 每个成分的方差解释量
total_var = eigenvalues.sum()
var_explained = eigenvalues / total_var
cum_var = np.cumsum(var_explained)

print("成分 | 特征值 | 方差 % | 累积 %")
for i in range(5):
    print(f"  PC{i+1}  |  {eigenvalues[i]:.4f}   |   {var_explained[i]*100:5.1f}   |    {cum_var[i]*100:5.1f}")

提示词

用 numpy.linalg.eigh 算 5×5 协方差矩阵的特征值,按降序排列,算每个主成分的方差解释比例和累积方差,打印成表格。

参考文献

Strang, Introduction to Linear Algebra, 5th edition, Wellesley-Cambridge Press, Chapter 6. ISBN: 978-0980232776.

Lax, Linear Algebra and Its Applications, 2nd edition, Wiley, Chapter 7. ISBN: 978-0471751564.