AI数学基础:矩阵
矩阵是线性代数的核心对象,也是机器学习、神经网络、数据处理的基础。矩阵乘法、转置、逆矩阵、秩、广播机制 必须熟练掌握。
基础定义
矩阵是由数字组成的矩形阵列,记作 A ∈ R m × n \boldsymbol{A} \in \mathbb{R}^{m \times n} A∈Rm×n,表示 m 行 n 列 的实数矩阵。
示例:
A = [ a 11 a 12 a 13 a 21 a 22 a 23 ] 2 × 3 \boldsymbol{A} = \begin{bmatrix} a_{11} & a_{12} & a_{13} \\ a_{21} & a_{22} & a_{23} \end{bmatrix}_{2 \times 3} A=[a11a21a12a22a13a23]2×3
一、矩阵基本运算
1. 矩阵加减法
规则 :两个矩阵形状必须完全相同( m × n m \times n m×n),对应位置元素直接相加减。
公式 :
( A ± B ) i j = A i j ± B i j (\boldsymbol{A} \pm \boldsymbol{B}){ij} = A{ij} \pm B_{ij} (A±B)ij=Aij±Bij
手工计算示例
设
A = [ 1 2 3 4 ] , B = [ 5 6 7 8 ] \boldsymbol{A} = \begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix}, \quad \boldsymbol{B} = \begin{bmatrix} 5 & 6 \\ 7 & 8 \end{bmatrix} A=[1324],B=[5768]
则
A + B = [ 1 + 5 2 + 6 3 + 7 4 + 8 ] = [ 6 8 10 12 ] \boldsymbol{A} + \boldsymbol{B} = \begin{bmatrix} 1+5 & 2+6 \\ 3+7 & 4+8 \end{bmatrix} = \begin{bmatrix} 6 & 8 \\ 10 & 12 \end{bmatrix} A+B=[1+53+72+64+8]=[610812]
Python 代码(NumPy + PyTorch)
python
import numpy as np
import torch
# NumPy
A_np = np.array([[1, 2], [3, 4]])
B_np = np.array([[5, 6], [7, 8]])
print("NumPy 加法:\n", A_np + B_np)
# PyTorch
A_pt = torch.tensor([[1, 2], [3, 4]])
B_pt = torch.tensor([[5, 6], [7, 8]])
print("PyTorch 加法:\n", A_pt + B_pt)
2. 矩阵乘法(AI 核心,必须熟练)
形状匹配规则:
- 左矩阵 A \boldsymbol{A} A 形状为 ( m × n ) (m \times n) (m×n),右矩阵 B \boldsymbol{B} B 形状为 ( n × p ) (n \times p) (n×p)
- 结果 C = A B \boldsymbol{C} = \boldsymbol{AB} C=AB 形状为 ( m × p ) (m \times p) (m×p)
- 要求: A \boldsymbol{A} A 的列数 n n n 等于 B \boldsymbol{B} B 的行数 n n n
计算公式 :
C i j = ∑ k = 1 n A i k ⋅ B k j C_{ij} = \sum_{k=1}^{n} A_{ik} \cdot B_{kj} Cij=k=1∑nAik⋅Bkj
手工计算示例(2×2 与 2×1)
设
A = [ 1 2 3 4 ] , B = [ 5 6 ] \boldsymbol{A} = \begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix}, \quad \boldsymbol{B} = \begin{bmatrix} 5 \\ 6 \end{bmatrix} A=[1324],B=[56]
则
A B = [ 1 × 5 + 2 × 6 3 × 5 + 4 × 6 ] = [ 17 39 ] \boldsymbol{AB} = \begin{bmatrix} 1\times5 + 2\times6 \\ 3\times5 + 4\times6 \end{bmatrix} = \begin{bmatrix} 17 \\ 39 \end{bmatrix} AB=[1×5+2×63×5+4×6]=[1739]
手工计算示例(2×2 与 2×2)
设
A = [ 1 2 3 4 ] , B = [ 5 6 7 8 ] \boldsymbol{A} = \begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix}, \quad \boldsymbol{B} = \begin{bmatrix} 5 & 6 \\ 7 & 8 \end{bmatrix} A=[1324],B=[5768]
则
A B = [ 1 ⋅ 5 + 2 ⋅ 7 1 ⋅ 6 + 2 ⋅ 8 3 ⋅ 5 + 4 ⋅ 7 3 ⋅ 6 + 4 ⋅ 8 ] = [ 19 22 43 50 ] \boldsymbol{AB} = \begin{bmatrix} 1\cdot5+2\cdot7 & 1\cdot6+2\cdot8 \\ 3\cdot5+4\cdot7 & 3\cdot6+4\cdot8 \end{bmatrix} = \begin{bmatrix} 19 & 22 \\ 43 & 50 \end{bmatrix} AB=[1⋅5+2⋅73⋅5+4⋅71⋅6+2⋅83⋅6+4⋅8]=[19432250]
Python 代码(NumPy + PyTorch)
python
import numpy as np
import torch
A = np.array([[1, 2], [3, 4]])
B = np.array([[5, 6], [7, 8]])
# NumPy
print("NumPy matmul:\n", np.matmul(A, B)) # 推荐
print("NumPy @:\n", A @ B) # Python 3.5+ 运算符
# PyTorch
A_pt = torch.tensor([[1, 2], [3, 4]])
B_pt = torch.tensor([[5, 6], [7, 8]])
print("PyTorch matmul:\n", torch.matmul(A_pt, B_pt))
print("PyTorch @:\n", A_pt @ B_pt)
注意 :矩阵乘法不满足交换律,即 A B ≠ B A \boldsymbol{AB} \neq \boldsymbol{BA} AB=BA 一般情况。
二、矩阵特殊运算
1. 转置(Transpose)
定义 :将矩阵的行与列互换,记作 A T \boldsymbol{A}^{\mathsf{T}} AT。
形状变化: ( m × n ) → ( n × m ) (m \times n) \to (n \times m) (m×n)→(n×m)。
公式 :
( A T ) i j = A j i (\boldsymbol{A}^{\mathsf{T}}){ij} = A{ji} (AT)ij=Aji
手工计算示例
设
A = [ 1 2 3 4 5 6 ] \boldsymbol{A} = \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{bmatrix} A=[142536]
则
A T = [ 1 4 2 5 3 6 ] \boldsymbol{A}^{\mathsf{T}} = \begin{bmatrix} 1 & 4 \\ 2 & 5 \\ 3 & 6 \end{bmatrix} AT= 123456
Python 代码
python
import numpy as np
import torch
A = np.array([[1, 2, 3], [4, 5, 6]])
print("NumPy 转置:\n", A.T)
A_pt = torch.tensor([[1, 2, 3], [4, 5, 6]])
print("PyTorch 转置:\n", A_pt.T)
2. 逆矩阵(Inverse)
定义 :对于方阵 A \boldsymbol{A} A( n × n n \times n n×n),若存在 B \boldsymbol{B} B 使得 A B = B A = I n \boldsymbol{AB} = \boldsymbol{BA} = \boldsymbol{I}_n AB=BA=In,则 B = A − 1 \boldsymbol{B} = \boldsymbol{A}^{-1} B=A−1 称为 A \boldsymbol{A} A 的逆矩阵。
存在条件 : A \boldsymbol{A} A 必须满秩,且行列式 det ( A ) ≠ 0 \det(\boldsymbol{A}) \neq 0 det(A)=0。
手工计算示例(2×2 矩阵)
对于 A = [ a b c d ] \boldsymbol{A} = \begin{bmatrix} a & b \\ c & d \end{bmatrix} A=[acbd],有
A − 1 = 1 a d − b c [ d − b − c a ] \boldsymbol{A}^{-1} = \frac{1}{ad - bc} \begin{bmatrix} d & -b \\ -c & a \end{bmatrix} A−1=ad−bc1[d−c−ba]
例:
A = [ 1 2 3 4 ] , det ( A ) = 1 ⋅ 4 − 2 ⋅ 3 = − 2 \boldsymbol{A} = \begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix},\quad \det(\boldsymbol{A}) = 1\cdot4 - 2\cdot3 = -2 A=[1324],det(A)=1⋅4−2⋅3=−2
A − 1 = 1 − 2 [ 4 − 2 − 3 1 ] = [ − 2 1 1.5 − 0.5 ] \boldsymbol{A}^{-1} = \frac{1}{-2} \begin{bmatrix} 4 & -2 \\ -3 & 1 \end{bmatrix} = \begin{bmatrix} -2 & 1 \\ 1.5 & -0.5 \end{bmatrix} A−1=−21[4−3−21]=[−21.51−0.5]
验证:
A A − 1 = [ 1 2 3 4 ] [ − 2 1 1.5 − 0.5 ] = [ 1 0 0 1 ] \boldsymbol{A}\boldsymbol{A}^{-1} = \begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix} \begin{bmatrix} -2 & 1 \\ 1.5 & -0.5 \end{bmatrix} = \begin{bmatrix} 1 & 0 \\ 0 & 1 \end{bmatrix} AA−1=[1324][−21.51−0.5]=[1001]
Python 代码
python
import numpy as np
import torch
# NumPy
A = np.array([[1, 2], [3, 4]])
A_inv = np.linalg.inv(A)
print("NumPy 逆矩阵:\n", A_inv)
# PyTorch(需要浮点类型)
A_pt = torch.tensor([[1., 2.], [3., 4.]])
A_inv_pt = torch.linalg.inv(A_pt)
print("PyTorch 逆矩阵:\n", A_inv_pt)
思考题 :3 * 3、4 * 4矩阵的逆矩阵的手工算法是什么?
*可汗学院(【可汗学院 公开课《线性代数》中英字幕-哔哩哔哩】 https://b23.tv/FqIIVyw)
3. 矩阵的秩(Rank)
定义 :矩阵中线性无关的行(或列)向量的最大数目,记作 rank ( A ) \operatorname{rank}(\boldsymbol{A}) rank(A)。
性质:
- 满秩矩阵:秩等于 min ( m , n ) \min(m, n) min(m,n)
- 秩为 1 的矩阵:所有行(或列)成比例
手工计算示例
设
A = [ 1 2 3 2 4 6 ] \boldsymbol{A} = \begin{bmatrix} 1 & 2 & 3 \\ 2 & 4 & 6 \end{bmatrix} A=[122436]
第二行是第一行的 2 倍 → 线性相关 → 秩为 1。
Python 代码
python
import numpy as np
import torch
# NumPy
A = np.array([[1, 2, 3], [2, 4, 6]])
print("NumPy 秩:", np.linalg.matrix_rank(A))
# PyTorch
A_pt = torch.tensor([[1., 2., 3.], [2., 4., 6.]])
print("PyTorch 秩:", torch.linalg.matrix_rank(A_pt))
三、特殊矩阵
1. 单位矩阵(Identity Matrix)
主对角线元素为 1,其余为 0 的 n × n n \times n n×n 方阵,记作 I n \boldsymbol{I}_n In。
性质 : A I n = A \boldsymbol{A}\boldsymbol{I}_n = \boldsymbol{A} AIn=A, I m A = A \boldsymbol{I}_m\boldsymbol{A} = \boldsymbol{A} ImA=A。
示例 ( I 3 \boldsymbol{I}_3 I3):
I 3 = [ 1 0 0 0 1 0 0 0 1 ] \boldsymbol{I}_3 = \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} I3= 100010001
Python 代码
python
import numpy as np
import torch
# NumPy
I_np = np.eye(3)
print("NumPy eye:\n", I_np)
# PyTorch
I_pt = torch.eye(3)
print("PyTorch eye:\n", I_pt)
2. 对角矩阵(Diagonal Matrix)
非对角线元素均为 0 的方阵,记作 diag ( d 1 , d 2 , ... , d n ) \operatorname{diag}(d_1, d_2, \dots, d_n) diag(d1,d2,...,dn)。
示例 :
Λ = [ 2 0 0 0 5 0 0 0 − 1 ] \boldsymbol{\Lambda} = \begin{bmatrix} 2 & 0 & 0 \\ 0 & 5 & 0 \\ 0 & 0 & -1 \end{bmatrix} Λ= 20005000−1
Python 代码
python
import numpy as np
import torch
# NumPy
diag_np = np.diag([2, 5, -1])
print("NumPy diag:\n", diag_np)
# PyTorch
diag_pt = torch.diag(torch.tensor([2., 5., -1.]))
print("PyTorch diag:\n", diag_pt)
四、广播机制(Broadcasting)
定义:在 NumPy / PyTorch 等库中,当对形状不同的两个数组进行逐元素运算时,自动扩展较小数组的维度,使形状匹配。
规则(从尾部维度开始对齐):
- 若两数组维度数不同,在较小数组前面补 1。
- 在每个维度上,若两个数组的大小相等或其中一个为 1,则该维度兼容;否则报错。
- 大小为 1 的维度会被拉伸到另一个数组的大小。
手工计算逻辑示例
矩阵 A \boldsymbol{A} A 形状 ( 2 , 3 ) (2,3) (2,3),向量 v \boldsymbol{v} v 形状 ( 3 , ) (3,) (3,):
A = [ 1 2 3 4 5 6 ] , v = [ 10 , 20 , 30 ] \boldsymbol{A} = \begin{bmatrix} 1 & 2 & 3 \\ 4 & 5 & 6 \end{bmatrix}, \quad \boldsymbol{v} = [10, 20, 30] A=[142536],v=[10,20,30]
广播后 v \boldsymbol{v} v 变为 ( 1 , 3 ) (1,3) (1,3),再扩展为 ( 2 , 3 ) (2,3) (2,3):
A + v = [ 11 22 33 14 25 36 ] \boldsymbol{A} + \boldsymbol{v} = \begin{bmatrix} 11 & 22 & 33 \\ 14 & 25 & 36 \end{bmatrix} A+v=[111422253336]
另一个示例:列向量广播
A = [ 1 2 3 4 ] , b = [ 5 6 ] \boldsymbol{A} = \begin{bmatrix} 1 & 2 \\ 3 & 4 \end{bmatrix}, \quad \boldsymbol{b} = \begin{bmatrix} 5 \\ 6 \end{bmatrix} A=[1324],b=[56]
广播后 b \boldsymbol{b} b 扩展为 ( 2 , 2 ) (2,2) (2,2):
A + b = [ 1 + 5 2 + 5 3 + 6 4 + 6 ] = [ 6 7 9 10 ] \boldsymbol{A} + \boldsymbol{b} = \begin{bmatrix} 1+5 & 2+5 \\ 3+6 & 4+6 \end{bmatrix} = \begin{bmatrix} 6 & 7 \\ 9 & 10 \end{bmatrix} A+b=[1+53+62+54+6]=[69710]
Python 代码
python
import numpy as np
import torch
# NumPy 行向量广播
A = np.array([[1, 2, 3], [4, 5, 6]])
v = np.array([10, 20, 30])
print("行向量广播:\n", A + v)
# NumPy 列向量广播
col = np.array([[10], [20]]) # 形状 (2,1)
print("列向量广播:\n", A + col)
# PyTorch 同样支持
A_pt = torch.tensor([[1, 2, 3], [4, 5, 6]])
v_pt = torch.tensor([10, 20, 30])
print("PyTorch 广播:\n", A_pt + v_pt)
五、学习资料链接(免费可直接访问)
| 主题 | 推荐资源 | 链接 |
|---|---|---|
| 矩阵直观理解 | 3Blue1Brown「线性代数的本质」 | YouTube 播放列表 |
| 矩阵基础教程 | Maths is Fun -- Matrices | https://www.mathsisfun.com/algebra/matrices.html |
| NumPy 矩阵操作 | NumPy 官方文档 | https://numpy.org/doc/stable/reference/routines.matrix.html |
| PyTorch 张量 | PyTorch 官方 Tensors 文档 | https://pytorch.org/docs/stable/tensors.html |
| 线性代数(中文视频) | B站「线性代数(AI必备)」 | https://www.bilibili.com/video/BV1a7411b7CE |
| 逆矩阵与秩 | Khan Academy 线性代数 | https://www.khanacademy.org/math/linear-algebra |
| 广播机制详解 | NumPy 官方广播文档 | https://numpy.org/doc/stable/user/basics.broadcasting.html |
| PyTorch 广播机制 | PyTorch 广播说明 | https://pytorch.org/docs/stable/notes/broadcasting.html |
总结
- 矩阵乘法:左列 = 右行,结果形状 = 左行 × 右列,是神经网络前向传播的核心运算。
- 逆矩阵:仅方阵且满秩可求,用于解线性方程组、最小二乘等。
- 秩:反映矩阵线性无关的行/列数量,决定矩阵的信息冗余度。
- 广播机制:自动扩展维度,极大简化批量运算的代码编写。
建议:多动手用小规模矩阵手工计算,再对比 NumPy / PyTorch 结果,能显著加深对线性代数运算的理解。