人工智能之数学基础 线性代数
第三章 特征值与特征向量
文章目录
- 人工智能之数学基础 线性代数
- 前言
- 一、定义
- 二、几何与物理意义
- 1. 几何解释(线性变换视角)
- 2. 物理意义举例
- 三、数学推导:如何求特征值与特征向量?
- 步骤总结:
- 四、重要性质
- 五、Python 代码实现
- 1. 基础计算:`numpy.linalg.eig`
- 2. 对称矩阵:使用 `eigh`(更高效稳定)
- 3. 可视化:2D 线性变换与特征向量
- 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) = 0det(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
importnumpyasnp# 定义一个方阵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 = λvforiinrange(len(eigenvalues)):v=eigenvectors[:,i]Av=A @ v lambda_v=eigenvalues[i]*vprint(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,它保证返回实数特征值,并按升序排列。
# 协方差矩阵(对称正定)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 线性变换与特征向量
importmatplotlib.pyplotaspltdefplot_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')foriinrange(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')foriinrange(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 的本质是:对数据协方差矩阵求特征向量,最大特征值对应的特征向量即第一主成分。
# 生成模拟数据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(只求部分特征对) |
| 重复特征值 | 可能无法得到完整特征向量基(缺陷矩阵) |
fromscipy.sparse.linalgimporteigs# 大型稀疏矩阵(示例)fromscipy.sparseimportrandom A_sparse=random(1000,1000,density=0.01)# 求最大的 5 个特征值/向量vals,vecs=eigs(A_sparse,k=5,which='LM')# LM = Largest Magnitudeprint("最大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》