11·数学基础入门

矩阵运算:乘法、转置与逆矩阵

mathlinear-algebra

第11课 - 矩阵运算:乘法、转置与逆矩阵

学习目标

通过本节课的学习,你将能够:

  1. 理解并应用矩阵乘法的规则(行乘列)。
  2. 掌握矩阵转置的定义与运算。
  3. 理解逆矩阵的概念,并能使用工具计算一个方阵的逆。
  4. 能够使用 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^TA’
  • 一个 (m, n) 矩阵的转置是 (n, m) 矩阵。
  • 转置操作常用于调整矩阵形状,以满足矩阵乘法的维度要求。

3. 逆矩阵:矩阵的“除法”

对于一个 n x n 的方阵 A,如果存在另一个 n x n 的方阵 A⁻¹,使得 A @ A⁻¹ = A⁻¹ @ A = II 是单位矩阵),那么 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]

  1. 计算外积 u^T @ v (即 u 的转置乘以 v)。结果矩阵的形状是什么?
  2. 计算内积(点积)u · u。结果是什么?与 u @ u^T 的结果有什么区别?

练习 3:综合挑战

一个简单线性方程组:2x + 3y = 84x + y = 2

  1. 将其写成矩阵形式 A * X = BA 是系数矩阵,X 是未知数向量 [x, y]^TB 是常数向量)。
  2. 使用 NumPy 计算 A 的逆矩阵 A⁻¹
  3. 利用公式 X = A⁻¹ @ B 求解 xy,并验证结果是否满足原方程组。

常见错误

  1. 矩阵尺寸不匹配:尝试将 (2, 3)(2, 3) 的矩阵相乘,这是最常见的错误。牢记乘法要求第一个矩阵的列数等于第二个矩阵的行数
  2. 混淆转置与逆:认为 A.T 就是 A 的逆。转置只是行列互换,逆矩阵才是代数意义上的“倒数”。
  3. 对非方阵或奇异矩阵求逆:忘记检查矩阵是否为方阵以及行列式是否为0。对非方阵使用 np.linalg.inv() 会直接报错。
  4. 忽略浮点误差:在验证 A @ A⁻¹ 时,由于计算机浮点运算的特性,结果可能不是精确的 10,而是一个非常接近的数(如 0.9999999998)。需要进行四舍五入或设置误差容忍度来比较。

小结

本节课我们学习了矩阵的三个核心运算:

  • 矩阵乘法:遵循“行乘列”规则,是机器学习算法(如神经网络前向传播)的基石。维度匹配是关键
  • 矩阵转置:一种简单的形状变换操作,常用于对齐维度以便进行后续计算。
  • 逆矩阵:是矩阵代数中的“除法”,用于求解线性方程组。它只对行列式不为0的方阵存在。

掌握这些运算,并熟练使用 NumPy 等工具进行计算,是进入更复杂机器学习模型(如线性回归、PCA)数学推导与实现的重要一步。下一课,我们将学习更深层次的矩阵属性——特征值与特征向量。

练习编辑器

rust
Loading...

继续学习

完成本课后,建议继续学习下一课「特征值与特征向量」 以巩固所学知识。