人工智能之数学基础 线性代数
第三章 特征值与特征向量
文章目录
- [人工智能之数学基础 线性代数](#人工智能之数学基础 线性代数)
- 前言
- 一、定义
- 二、几何与物理意义
- [1. 几何解释(线性变换视角)](#1. 几何解释(线性变换视角))
- [2. 物理意义举例](#2. 物理意义举例)
- 三、数学推导:如何求特征值与特征向量?
- [五、Python 代码实现](#五、Python 代码实现)
- [1. 基础计算:`numpy.linalg.eig`](#1. 基础计算:
numpy.linalg.eig)- [2. 对称矩阵:使用 `eigh`(更高效稳定)](#2. 对称矩阵:使用
eigh(更高效稳定))- [3. 可视化:2D 线性变换与特征向量](#3. 可视化:2D 线性变换与特征向量)
- [4. 应用示例:主成分分析(PCA)核心](#4. 应用示例:主成分分析(PCA)核心)
- 六、数值计算注意事项
- 后续
- 资料关注
前言
特征值(Eigenvalues)和特征向量(Eigenvectors)是线性代数中最具洞察力的概念之一,广泛应用于主成分分析(PCA) 、稳定性分析 、振动模态 、图神经网络 、PageRank算法 等领域。本文将从定义、计算方法、几何/物理意义 出发,并提供完整的 Python 代码实现。
一、定义
设 A \\in \\mathbb{R}\^{n \\times n} 是一个 方阵 。若存在一个非零向量 \\mathbf{v} \\in \\mathbb{R}\^n 和一个标量 \\lambda \\in \\mathbb{R} (或 \\mathbb{C} ),使得:
A v = λ v A \mathbf{v} = \lambda \mathbf{v} Av=λv
则称:
- \\lambda 为矩阵 A 的一个 特征值(eigenvalue)
- \\mathbf{v} 为对应于 \\lambda 的 特征向量(eigenvector)
注意:特征向量不能是零向量;但特征值可以为 0。
二、几何与物理意义
1. 几何解释(线性变换视角)
- 矩阵 A 表示一个线性变换(如旋转、拉伸、剪切等)。
- 特征向量是那些在变换后方向不变(或反向)的向量;
- 特征值表示该方向上的伸缩比例 :
- \|\\lambda\| \> 1 :拉伸
- \|\\lambda\| \< 1 :压缩
- \\lambda \< 0 :反向
- \\lambda = 1 :不变
例如:对角矩阵
A = [ 3 0 0 2 ] A = \begin{bmatrix} 3 & 0 \\ 0 & 2 \end{bmatrix} A=[3002]
的特征向量是坐标轴方向,特征值分别是 3 和 2 ------ 沿 x 轴拉伸 3 倍,y 轴拉伸 2 倍。
2. 物理意义举例
| 领域 | 应用 |
|---|---|
| 力学 | 振动系统的固有频率(特征值)与振型(特征向量) |
| 量子力学 | 哈密顿算符的本征态与能量 |
| 图论 | 图的拉普拉斯矩阵的特征值反映连通性(谱聚类) |
| 机器学习 | PCA 中协方差矩阵的特征向量 = 主成分方向 |
三、数学推导:如何求特征值与特征向量?
从定义出发:
A v = λ v ⇒ ( A − λ I ) v = 0 A \mathbf{v} = \lambda \mathbf{v} \Rightarrow (A - \lambda I) \mathbf{v} = \mathbf{0} Av=λv⇒(A−λI)v=0
要使非零解 \\mathbf{v} \\ne \\mathbf{0} 存在,系数矩阵必须奇异(不可逆),即:
det ( A − λ I ) = 0 \det(A - \lambda I) = 0 det(A−λI)=0
这个关于 \\lambda 的多项式方程称为 特征方程(Characteristic Equation),其根即为所有特征值。
步骤总结:
- 计算特征多项式: p(\\lambda) = \\det(A - \\lambda I)
- 解方程 p(\\lambda) = 0 得到特征值 \\lambda_1, \\dots, \\lambda_n
- 对每个 \\lambda_i ,解齐次线性方程组 (A - \\lambda_i I)\\mathbf{v} = \\mathbf{0} 得到特征向量
注: n \\times n 矩阵最多有 n 个线性无关的特征向量。
四、重要性质
| 性质 | 说明 |
|---|---|
| 迹(Trace) | \\text{tr}(A) = \\sum \\lambda_i |
| 行列式 | \\det(A) = \\prod \\lambda_i |
| 可对角化 | 若 A 有 n 个线性无关的特征向量,则 A = PDP\^{-1} ,其中 D 为对角矩阵(对角元为特征值) |
| 对称矩阵 | 实对称矩阵的特征值为实数,且存在标准正交特征向量基 |
| 正定矩阵 | 所有特征值 > 0 |
五、Python 代码实现
1. 基础计算:numpy.linalg.eig
python
import numpy as np
# 定义一个方阵
A = np.array([[4, 2],
[1, 3]], dtype=float)
# 计算特征值和特征向量
eigenvalues, eigenvectors = np.linalg.eig(A)
print("矩阵 A:\n", A)
print("\n特征值 λ:", eigenvalues)
print("\n特征向量(每列为一个特征向量):\n", eigenvectors)
# 验证 Av = λv
for i in range(len(eigenvalues)):
v = eigenvectors[:, i]
Av = A @ v
lambda_v = eigenvalues[i] * v
print(f"\n验证第 {i+1} 个特征对:")
print("A v =", Av)
print("λ v =", lambda_v)
print("误差范数:", np.linalg.norm(Av - lambda_v))
输出示例:
特征值 λ: [5. 2.] 特征向量: [[ 0.89442719 -0.70710678] [ 0.4472136 0.70710678]]
2. 对称矩阵:使用 eigh(更高效稳定)
对于实对称矩阵 (如协方差矩阵),推荐使用 np.linalg.eigh,它保证返回实数特征值,并按升序排列。
python
# 协方差矩阵(对称正定)
C = np.array([[2, 1],
[1, 2]], dtype=float)
eigvals, eigvecs = np.linalg.eigh(C) # 'h' 表示 Hermitian(对称)
print("特征值(升序):", eigvals)
print("标准正交特征向量:\n", eigvecs)
print("验证正交性 Q^T Q = I:\n", np.round(eigvecs.T @ eigvecs, 10))
3. 可视化:2D 线性变换与特征向量
python
import matplotlib.pyplot as plt
def plot_eigenvectors(A):
vals, vecs = np.linalg.eig(A)
# 创建网格点
x = np.linspace(-2, 2, 10)
y = np.linspace(-2, 2, 10)
X, Y = np.meshgrid(x, y)
points = np.vstack([X.ravel(), Y.ravel()])
# 应用变换
transformed = A @ points
plt.figure(figsize=(10, 4))
# 原始空间
plt.subplot(1, 2, 1)
plt.quiver(points[0], points[1],
np.zeros_like(points[0]), np.zeros_like(points[1]),
angles='xy', scale_units='xy', scale=1, color='lightgray')
for i in range(vecs.shape[1]):
v = vecs[:, i]
plt.arrow(0, 0, v[0], v[1],
head_width=0.1, color='red', linewidth=2, label=f'v{i+1}')
plt.title('原始空间(特征向量 in red)')
plt.axis('equal')
plt.grid(True)
# 变换后空间
plt.subplot(1, 2, 2)
plt.quiver(transformed[0], transformed[1],
np.zeros_like(transformed[0]), np.zeros_like(transformed[1]),
angles='xy', scale_units='xy', scale=1, color='lightgray')
for i in range(vecs.shape[1]):
v = vecs[:, i]
Av = A @ v
plt.arrow(0, 0, Av[0], Av[1],
head_width=0.1, color='blue', linewidth=2, label=f'A v{i+1}')
plt.title('变换后空间(Av in blue)')
plt.axis('equal')
plt.grid(True)
plt.tight_layout()
plt.show()
# 示例矩阵
A = np.array([[3, 1],
[0, 2]])
plot_eigenvectors(A)
红色特征向量在变换后(蓝色)仍在同一直线上,仅长度变化!
4. 应用示例:主成分分析(PCA)核心
PCA 的本质是:对数据协方差矩阵求特征向量,最大特征值对应的特征向量即第一主成分。
python
# 生成模拟数据
np.random.seed(0)
X = np.random.randn(100, 2) @ np.array([[3, 1], [1, 1]]) # 椭圆分布
# 中心化
X_centered = X - X.mean(axis=0)
# 计算协方差矩阵
C = np.cov(X_centered, rowvar=False)
# 求特征值/向量
eigvals, eigvecs = np.linalg.eigh(C)
# 按特征值降序排序
idx = np.argsort(eigvals)[::-1]
eigvals = eigvals[idx]
eigvecs = eigvecs[:, idx]
print("协方差矩阵特征值:", eigvals)
print("第一主成分方向:", eigvecs[:, 0])
# 可视化
plt.scatter(X_centered[:, 0], X_centered[:, 1], alpha=0.6)
origin = [0, 0]
plt.quiver(*origin, *eigvecs[:, 0] * np.sqrt(eigvals[0]),
color='r', scale=3, label='PC1')
plt.quiver(*origin, *eigvecs[:, 1] * np.sqrt(eigvals[1]),
color='g', scale=3, label='PC2')
plt.legend()
plt.title('PCA: 主成分(特征向量)')
plt.axis('equal')
plt.grid(True)
plt.show()
六、数值计算注意事项
| 问题 | 建议 |
|---|---|
| 非对称矩阵 | 使用 eig,但特征值可能是复数 |
| 病态矩阵 | 特征值对扰动敏感,可用 SVD 替代 |
| 大型稀疏矩阵 | 使用 scipy.sparse.linalg.eigs(只求部分特征对) |
| 重复特征值 | 可能无法得到完整特征向量基(缺陷矩阵) |
python
from scipy.sparse.linalg import eigs
# 大型稀疏矩阵(示例)
from scipy.sparse import random
A_sparse = random(1000, 1000, density=0.01)
# 求最大的 5 个特征值/向量
vals, vecs = eigs(A_sparse, k=5, which='LM') # LM = Largest Magnitude
print("最大5个特征值:", vals)
七、总结
| 概念 | 核心思想 |
|---|---|
| 特征值/向量 | 线性变换中"不变方向"及其伸缩因子 |
| 计算 | 解 \\det(A - \\lambda I) = 0 ,再解齐次方程 |
| 对称矩阵 | 特征值为实数,特征向量正交 → 可用于 PCA、谱聚类 |
| 应用 | 降维、稳定性分析、振动模态、PageRank、量子力学等 |
💡 记住:特征分解揭示了矩阵的"内在结构"。当你看到一个线性系统,问自己:"它的特征方向是什么?"------答案往往指向最本质的行为。
后续
python过渡项目部分代码已经上传至gitee,后续会逐步更新。
资料关注
公众号:咚咚王
gitee:https://gitee.com/wy18585051844/ai_learning
《Python编程:从入门到实践》
《利用Python进行数据分析》
《算法导论中文第三版》
《概率论与数理统计(第四版) (盛骤) 》
《程序员的数学》
《线性代数应该这样学第3版》
《微积分和数学分析引论》
《(西瓜书)周志华-机器学习》
《TensorFlow机器学习实战指南》
《Sklearn与TensorFlow机器学习实用指南》
《模式识别(第四版)》
《深度学习 deep learning》伊恩·古德费洛著 花书
《Python深度学习第二版(中文版)【纯文本】 (登封大数据 (Francois Choliet)) (Z-Library)》
《深入浅出神经网络与深度学习+(迈克尔·尼尔森(Michael+Nielsen)》
《自然语言处理综论 第2版》
《Natural-Language-Processing-with-PyTorch》
《计算机视觉-算法与应用(中文版)》
《Learning OpenCV 4》
《AIGC:智能创作时代》杜雨+&+张孜铭
《AIGC原理与实践:零基础学大语言模型、扩散模型和多模态模型》
《从零构建大语言模型(中文版)》
《实战AI大模型》
《AI 3.0》