第11课 - 矩阵运算:乘法、转置与逆矩阵
学习目标
通过本节课的学习,你将能够:
- 理解并应用矩阵乘法的规则(行乘列)。
- 掌握矩阵转置的定义与运算。
- 理解逆矩阵的概念,并能使用工具计算一个方阵的逆。
- 能够使用 Python (NumPy) 实现矩阵的基本运算。
核心概念
1. 矩阵乘法:工厂的“流水线”
矩阵乘法是机器学习中最核心的运算之一,例如在神经网络中,权重矩阵与输入数据的相乘就是一次矩阵乘法。
想象一下:第一个矩阵是“原料清单”(形状为 (m, n)),第二个矩阵是“生产线规则”(形状为 (n, p))。只有当第一个矩阵的列数(n)等于第二个矩阵的行数(n)时,才能相乘,这就像原料必须符合生产线的输入规格。
结果矩阵的尺寸是 (m, p),它的每个元素 (i, j) 是第一个矩阵的第 i 行与第二个矩阵的第 j 列的点积(对应元素相乘再求和)。这个过程就像按照配方规则加工原料。
规则: C = A @ B
其中 A (m x n) 和 B (n x p) 相乘得到 C (m x p)
C[i][j] = A的第i行 与 B的第j列 的点积
2. 矩阵转置:行列互换
矩阵转置非常简单,就像把一个表格沿左上角到右下角的对角线翻转。原矩阵的第 i 行第 j 列的元素,变成了转置后矩阵的第 j 行第 i 列的元素。
- 记作
A^T或A’。 - 一个
(m, n)矩阵的转置是(n, m)矩阵。 - 转置操作常用于调整矩阵形状,以满足矩阵乘法的维度要求。
3. 逆矩阵:矩阵的“除法”
对于一个 n x n 的方阵 A,如果存在另一个 n x n 的方阵 A⁻¹,使得 A @ A⁻¹ = A⁻¹ @ A = I(I 是单位矩阵),那么 A⁻¹ 就称为 A 的逆矩阵。
- 这相当于矩阵的“倒数”。在标量中,
a * (1/a) = 1。 - 只有方阵才可能有逆,且其行列式不为0时,逆矩阵才存在。
- 逆矩阵在求解线性方程组
Ax = b时至关重要,解为x = A⁻¹b。
代码示例
import numpy as np
# 初始化两个矩阵
# A: 2行3列
A = np.array([[1, 2, 3],
[4, 5, 6]])
# B: 3行2列
B = np.array([[7, 8],
[9, 10],
[11, 12]])
print("矩阵 A:")
print(A)
print("矩阵 B:")
print(B)
# 1. 矩阵乘法 (注意维度: A(2x3) @ B(3x2) = C(2x2))
C = A @ B # 等价于 np.dot(A, B)
print("\n矩阵乘法 A @ B 的结果:")
print(C)
# 2. 矩阵转置
A_T = A.T # 等价于 np.transpose(A)
print("\n矩阵 A 的转置 A.T:")
print(A_T)
print(f"A 的形状: {A.shape}, A.T 的形状: {A_T.shape}")
# 3. 逆矩阵
# 创建一个可逆的2x2方阵
D = np.array([[4, 7],
[2, 6]])
print("\n方阵 D:")
print(D)
# 计算行列式,判断是否可逆
det_D = np.linalg.det(D)
print(f"D 的行列式: {det_D:.2f}")
if abs(det_D) > 1e-10: # 行列式不为0
# 计算逆矩阵
D_inv = np.linalg.inv(D)
print("D 的逆矩阵 D_inv:")
print(D_inv)
# 验证: D @ D_inv 应该接近单位矩阵
identity_check = D @ D_inv
print("\n验证 D @ D_inv (应为单位矩阵):")
print(np.round(identity_check, decimals=10)) # 四舍五入,消除浮点误差
else:
print("矩阵 D 的行列式为0,没有逆矩阵。")
# 一个不可逆的例子(奇异矩阵)
E = np.array([[1, 2],
[2, 4]])
det_E = np.linalg.det(E)
print(f"\n方阵 E 的行列式: {det_E:.2f}")
try:
E_inv = np.linalg.inv(E)
except np.linalg.LinAlgError as e:
print(f"计算逆矩阵时出错: {e}")
预期输出:
矩阵 A:
[[1 2 3]
[4 5 6]]
矩阵 B:
[[ 7 8]
[ 9 10]
[11 12]]
矩阵乘法 A @ B 的结果:
[[ 58 64]
[139 154]]
矩阵 A 的转置 A.T:
[[1 4]
[2 5]
[3 6]]
A 的形状: (2, 3), A.T 的形状: (3, 2)
方阵 D:
[[4 7]
[2 6]]
D 的行列式: 10.00
D 的逆矩阵 D_inv:
[[ 0.6 -0.7]
[-0.2 0.4]]
验证 D @ D_inv (应为单位矩阵):
[[1. 0.]
[0. 1.]]
方阵 E 的行列式: 0.00
计算逆矩阵时出错: Singular matrix
实践练习
练习 1:基础乘法
给定矩阵 X = [[1, 0], [0, 1], [1, 1]] (形状3x2) 和向量 w = [2, 3] (形状2x1)。请计算 X @ w 的结果,并输出结果矩阵的形状。
(提示:向量可以看作只有一列的矩阵)
练习 2:转置的应用
给定两个向量 u = [1, 2, 3] 和 v = [4, 5]。
- 计算外积
u^T @ v(即u的转置乘以v)。结果矩阵的形状是什么? - 计算内积(点积)
u · u。结果是什么?与u @ u^T的结果有什么区别?
练习 3:综合挑战
一个简单线性方程组:2x + 3y = 8,4x + y = 2。
- 将其写成矩阵形式
A * X = B(A是系数矩阵,X是未知数向量[x, y]^T,B是常数向量)。 - 使用 NumPy 计算
A的逆矩阵A⁻¹。 - 利用公式
X = A⁻¹ @ B求解x和y,并验证结果是否满足原方程组。
常见错误
- 矩阵尺寸不匹配:尝试将
(2, 3)和(2, 3)的矩阵相乘,这是最常见的错误。牢记乘法要求第一个矩阵的列数等于第二个矩阵的行数。 - 混淆转置与逆:认为
A.T就是A的逆。转置只是行列互换,逆矩阵才是代数意义上的“倒数”。 - 对非方阵或奇异矩阵求逆:忘记检查矩阵是否为方阵以及行列式是否为0。对非方阵使用
np.linalg.inv()会直接报错。 - 忽略浮点误差:在验证
A @ A⁻¹时,由于计算机浮点运算的特性,结果可能不是精确的1或0,而是一个非常接近的数(如0.9999999998)。需要进行四舍五入或设置误差容忍度来比较。
小结
本节课我们学习了矩阵的三个核心运算:
- 矩阵乘法:遵循“行乘列”规则,是机器学习算法(如神经网络前向传播)的基石。维度匹配是关键。
- 矩阵转置:一种简单的形状变换操作,常用于对齐维度以便进行后续计算。
- 逆矩阵:是矩阵代数中的“除法”,用于求解线性方程组。它只对行列式不为0的方阵存在。
掌握这些运算,并熟练使用 NumPy 等工具进行计算,是进入更复杂机器学习模型(如线性回归、PCA)数学推导与实现的重要一步。下一课,我们将学习更深层次的矩阵属性——特征值与特征向量。
练习编辑器
rust
Loading...