人工智能之数学基础 线性代数
第四章 矩阵分解
文章目录
- [人工智能之数学基础 线性代数](#人工智能之数学基础 线性代数)
- 前言
- 一、为什么需要矩阵分解?
- [二、1. 奇异值分解(Singular Value Decomposition, SVD)](#二、1. 奇异值分解(Singular Value Decomposition, SVD))
- [✅ 定义](#✅ 定义)
- [🌐 几何意义](#🌐 几何意义)
- [🔧 应用场景](#🔧 应用场景)
- [💻 Python 实现](#💻 Python 实现)
- [🖼️ 应用:图像压缩(SVD 截断)](#🖼️ 应用:图像压缩(SVD 截断))
- [三、2. LU 分解(LU Decomposition)](#三、2. LU 分解(LU Decomposition))
- [✅ 定义](#✅ 定义)
- [🔧 应用场景](#🔧 应用场景)
- [💻 Python 实现(使用 SciPy)](#💻 Python 实现(使用 SciPy))
- [四、3. QR 分解(QR Decomposition)](#四、3. QR 分解(QR Decomposition))
- [✅ 定义](#✅ 定义)
- [🔧 应用场景](#🔧 应用场景)
- [💻 Python 实现](#💻 Python 实现)
- [五、4. 特征分解(Eigendecomposition)](#五、4. 特征分解(Eigendecomposition))
- [✅ 定义](#✅ 定义)
- [💻 Python 实现](#💻 Python 实现)
- 六、分解方法对比总结
- [七、进阶:使用分解求伪逆(Moore-Penrose 逆)](#七、进阶:使用分解求伪逆(Moore-Penrose 逆))
- 八、结语
- 后续
- 资料关注
前言
矩阵分解(Matrix Factorization)是将一个矩阵表示为若干个结构更简单或具有特定性质的矩阵乘积的过程。它是数值线性代数、机器学习、信号处理、优化等领域的核心工具。本文将系统介绍奇异值分解(SVD) 、LU 分解 、QR 分解 和 特征分解(Eigendecomposition) ,并提供完整的 Python(NumPy/SciPy)代码实现。
一、为什么需要矩阵分解?
- 简化计算 :如求解线性方程组 A x = b Ax = b Ax=b
- 揭示结构:如 SVD 揭示数据的主方向
- 降维与压缩:如 PCA 基于 SVD
- 数值稳定性:避免直接求逆
- 算法加速:利用稀疏性或正交性
二、1. 奇异值分解(Singular Value Decomposition, SVD)
✅ 定义
对任意矩阵 A \\in \\mathbb{R}\^{m \\times n} (不要求方阵),存在分解:
A = U Σ V T A = U \Sigma V^T A=UΣVT
其中:
- U \\in \\mathbb{R}\^{m \\times m} : ∗ ∗ 左奇异向量矩阵 ∗ ∗ ,列向量正交 :\*\*左奇异向量矩阵\*\*,列向量正交 :∗∗左奇异向量矩阵∗∗,列向量正交(U\^T U = I)
- V \\in \\mathbb{R}\^{n \\times n} : ∗ ∗ 右奇异向量矩阵 ∗ ∗ ,列向量正交 :\*\*右奇异向量矩阵\*\*,列向量正交 :∗∗右奇异向量矩阵∗∗,列向量正交(V\^T V = I)
- \\Sigma \\in \\mathbb{R}\^{m \\times n} :奇异值矩阵 ,对角线上为非负实数 σ 1 ≥ σ 2 ≥ ⋯ ≥ σ r > 0 \sigma_1 \geq \sigma_2 \geq \cdots \geq \sigma_r > 0 σ1≥σ2≥⋯≥σr>0 ( r = rank ( A ) (r = \text{rank}(A) (r=rank(A)),其余为 0
奇异值 σ i = λ i \sigma_i = \sqrt{\lambda_i} σi=λi ,其中 λ i \lambda_i λi 是 A T A A^T A ATA 或 A A T AA^T AAT 的特征值。
🌐 几何意义
SVD 将任意线性变换分解为三步:
- 旋转/反射 ( V T V^T VT)
- 沿坐标轴缩放 ( Σ \Sigma Σ)
- 再次旋转/反射 ( U U U)
🔧 应用场景
- 主成分分析(PCA)
- 图像压缩
- 推荐系统(如 Netflix 算法)
- 伪逆计算(最小二乘解)
- 降噪
💻 Python 实现
python
import numpy as np
import matplotlib.pyplot as plt
# 示例矩阵(非方阵)
A = np.array([[3, 1, 1],
[-1, 3, 1]], dtype=float)
# 完整 SVD
U, s, VT = np.linalg.svd(A)
Sigma = np.zeros_like(A, dtype=float)
np.fill_diagonal(Sigma, s)
print("A =\n", A)
print("\nU =\n", U)
print("\n奇异值 s =", s)
print("\nΣ =\n", Sigma)
print("\nV^T =\n", VT)
# 验证 A ≈ U @ Σ @ V^T
A_reconstructed = U @ Sigma @ VT
print("\n重建误差 ||A - UΣV^T||_F =", np.linalg.norm(A - A_reconstructed, 'fro'))
# 经济型 SVD(更高效)
U_econ, s_econ, VT_econ = np.linalg.svd(A, full_matrices=False)
print("\n经济型 SVD 形状:", U_econ.shape, s_econ.shape, VT_econ.shape)
🖼️ 应用:图像压缩(SVD 截断)
python
from PIL import Image
# 读取灰度图像
img = Image.open('lena.png').convert('L') # 替换为你的图片路径
A = np.array(img, dtype=float)
# SVD
U, s, VT = np.linalg.svd(A)
# 保留前 k 个奇异值
k = 50
A_k = U[:, :k] @ np.diag(s[:k]) @ VT[:k, :]
# 显示
plt.figure(figsize=(12, 4))
plt.subplot(1, 3, 1); plt.imshow(A, cmap='gray'); plt.title('原始图像')
plt.subplot(1, 3, 2); plt.imshow(A_k, cmap='gray'); plt.title(f'k={k} 的近似')
plt.subplot(1, 3, 3); plt.plot(s); plt.title('奇异值衰减'); plt.xlabel('索引'); plt.ylabel('σ')
plt.tight_layout()
plt.show()
print(f"压缩率: 原始 {A.size} 元素 → 存储 {k*(A.shape[0]+A.shape[1]+1)} 元素")
三、2. LU 分解(LU Decomposition)
✅ 定义
对方阵 A \\in \\mathbb{R}\^{n \\times n} ,若其所有顺序主子式非零,则可分解为:
A = L U A = L U A=LU
其中:
-
L :下三角矩阵(Lower triangular),对角线通常为 1(Doolittle 分解)
-
U :上三角矩阵(Upper triangular)
实际中常使用 带行交换的 LU 分解(PA = LU) ,其中 P P P 是置换矩阵,提高数值稳定性。
🔧 应用场景
- 高效求解多个右端项的线性方程组 A x = b 1 , b 2 , ... Ax = b_1, b_2, \dots Ax=b1,b2,...
- 计算行列式: det ( A ) = ∏ i U i i \det(A) = \prod_i U_{ii} det(A)=∏iUii
- 求矩阵逆
💻 Python 实现(使用 SciPy)
python
import numpy as np
from scipy.linalg import lu
A = np.array([[2, 1, 1],
[4, 3, 3],
[8, 7, 9]], dtype=float)
# PA = LU
P, L, U = lu(A)
print("A =\n", A)
print("\nP =\n", P)
print("\nL =\n", L)
print("\nU =\n", U)
print("\n验证 PA = LU:\n", np.allclose(P @ A, L @ U))
# 求解 Ax = b
b = np.array([1, 2, 3], dtype=float)
# 步骤:PAx = Pb → LUx = Pb
# 先解 Ly = Pb(前向代入),再解 Ux = y(后向代入)
from scipy.linalg import solve_triangular
Pb = P @ b
y = solve_triangular(L, Pb, lower=True)
x = solve_triangular(U, y, lower=False)
print("\n解 x =", x)
print("验证 Ax = b:", np.allclose(A @ x, b))
四、3. QR 分解(QR Decomposition)
✅ 定义
对任意矩阵 A \\in \\mathbb{R}\^{m \\times n} ( m ≥ n (m \geq n (m≥n),存在分解:
A = Q R A = Q R A=QR
其中:
- Q \\in \\mathbb{R}\^{m \\times m} : ∗ ∗ 正交矩阵 ∗ ∗ ( :\*\*正交矩阵\*\*( :∗∗正交矩阵∗∗(Q\^T Q = I)
- R \\in \\mathbb{R}\^{m \\times n} :上三角矩阵
经济型 QR:Q \\in \\mathbb{R}\^{m \\times n}, R \\in \\mathbb{R}\^{n \\times n}
🔧 应用场景
- 求解最小二乘问题
- 特征值计算(QR 算法)
- Gram-Schmidt 正交化的稳定实现
💻 Python 实现
python
import numpy as np
from scipy.linalg import qr
A = np.array([[1, 1],
[1, 0],
[0, 1]], dtype=float)
# 完整 QR
Q_full, R_full = qr(A, mode='full')
# 经济型 QR
Q, R = qr(A, mode='economic')
print("A =\n", A)
print("\nQ (经济型) =\n", Q)
print("\nR =\n", R)
print("\n验证 A = QR:", np.allclose(A, Q @ R))
print("Q 正交性 Q^T Q = I:\n", np.round(Q.T @ Q, 10))
# 用 QR 解最小二乘:min ||Ax - b||
b = np.array([2, 1, 3], dtype=float)
# Ax = b → QRx = b → Rx = Q^T b
x = solve_triangular(R, Q.T @ b)
print("\n最小二乘解 x =", x)
print("残差范数:", np.linalg.norm(A @ x - b))
五、4. 特征分解(Eigendecomposition)
✅ 定义
对可对角化方阵 A \\in \\mathbb{R}\^{n \\times n} ,若存在 n n n个线性无关特征向量,则:
A = Q Λ Q − 1 A = Q \Lambda Q^{-1} A=QΛQ−1
其中:
- Q :特征向量矩阵(每列为一个特征向量)
- \\Lambda :对角矩阵,对角元为特征值
若 A A A 是实对称矩阵 ,则 Q Q Q 可选为正交矩阵,即 A = Q Λ Q T A = Q \Lambda Q^T A=QΛQT
💻 Python 实现
python
import numpy as np
# 对称矩阵(保证可正交对角化)
A = np.array([[4, 2],
[2, 3]], dtype=float)
# 使用 eigh(对称矩阵专用)
eigvals, Q = np.linalg.eigh(A)
Lambda = np.diag(eigvals)
print("A =\n", A)
print("\nΛ =\n", Lambda)
print("\nQ =\n", Q)
print("\n验证 A = Q Λ Q^T:", np.allclose(A, Q @ Lambda @ Q.T))
六、分解方法对比总结
| 分解类型 | 适用矩阵 | 形式 | 关键性质 | 主要用途 |
|---|---|---|---|---|
| SVD | 任意 m × n m \times n m×n | A = U Σ V T A = U \Sigma V^T A=UΣVT | U , V U, V U,V 正交, Σ \Sigma Σ对角非负 | 降维、压缩、伪逆、PCA |
| LU | 方阵(通常非奇异) | P A = L U PA = LU PA=LU | L L L下三角, U U U 上三角 | 解线性方程组、行列式 |
| QR | 任意 m × n m \times n m×n( m ≥ n m \ge n m≥n) | A = Q R A = QR A=QR | Q Q Q 正交, R R R 上三角 | 最小二乘、特征值算法 |
| 特征分解 | 可对角化方阵 | A = Q Λ Q − 1 A = Q \Lambda Q^{-1} A=QΛQ−1 | Λ \Lambda Λ 对角 | 动力系统、PCA(协方差矩阵) |
七、进阶:使用分解求伪逆(Moore-Penrose 逆)
对于任意矩阵 A A A,其伪逆为:
A + = V Σ + U T A^+ = V \Sigma^+ U^T A+=VΣ+UT
其中 Σ + \Sigma^+ Σ+ 是将 Σ \Sigma Σ 中非零奇异值取倒数并转置。
python
# 用 SVD 计算伪逆
U, s, VT = np.linalg.svd(A, full_matrices=False)
# 构造 Σ⁺
s_inv = np.array([1/si if si > 1e-10 else 0 for si in s])
A_pinv = VT.T @ np.diag(s_inv) @ U.T
# 对比 NumPy 内置函数
A_pinv_np = np.linalg.pinv(A)
print("伪逆一致?", np.allclose(A_pinv, A_pinv_np))
八、结语
矩阵分解是连接理论与应用的桥梁:
- SVD 是最通用、最强大的工具,适用于任何矩阵;
- LU/QR 是数值线性代数的基石,用于高效求解方程;
- 特征分解 揭示了方阵的内在动力学。
后续
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》