趋近智
本课程已归档: 现已推出包含更新教学大纲和改进内容的新版本。
虽然矩阵加法、减法和标量乘法是按元素进行运算的,但矩阵乘法的工作方式大不相同。它是一种基本运算,根据涉及行和列的规则组合两个矩阵,而不仅仅是对应元素。此运算对机器学习中的许多原理都非常重要,例如转换数据点、在神经网络中连接计算步骤以及表示线性方程组。
矩阵乘法是一种将两个矩阵组合起来的操作。为了执行矩阵乘法,被相乘的两个矩阵必须满足关于其维度的特定条件。例如,如果矩阵 A 的维度是 mimesn(即 m 行 n 列),而矩阵 B 的维度是 nimesp(即 n 行 p 列),则矩阵积 AB 才会被定义。
最重要的一点是,第一个矩阵(A)的列数必须等于第二个矩阵(B)的行数。在此情况下,两者都是 n。
结果矩阵,我们称之为 C=AB,其维度将是 m×p。它将具有与第一个矩阵 (A) 相同的行数,以及与第二个矩阵 (B) 相同的列数。
m×nA×n×pB=m×pC
如果内部维度不匹配(n=n),则矩阵无法按该顺序相乘。
我们如何找出结果矩阵 C 内部的值?每个元素 Cij(矩阵 C 中第 i 行第 j 列的元素)是通过取矩阵 A 的第 i 行与矩阵 B 的第 j 列的点积来计算的。
请记住,两个向量 u=[u1,u2,…,un] 和 v=[v1,v2,…,vn] 的点积是 u⋅v=u1v1+u2v2+⋯+unvn=∑k=1nukvk。
对于矩阵乘法 C=AB,若 A 是 m×n 矩阵且 B 是 n×p 矩阵:
Cij=(A 的第 i 行)⋅(B 的第 j 列)
从数学上讲,如果 Aik 是 A 中第 i 行第 k 列的元素,并且 Bkj 是 B 中第 k 行第 j 列的元素,则:
Cij=∑k=1nAikBkj
这意味着您将 A 的行和 B 的列中的对应元素相乘,然后将这些乘积相加。
这是一个可视化表示,展示了矩阵 A 的第 i 行和矩阵 B 的第 j 列如何通过点积组合来计算结果矩阵 C 中的元素 Cij。
让我们将一个 2×3 矩阵 A 乘以一个 3×2 矩阵 B。结果 C 应该是一个 2×2 矩阵。
A=[142536]B=792813结果矩阵是 C=AB:
C=[C11C21C12C22]让我们计算每个元素:
因此,结果矩阵是:
C=AB=[31851955]NumPy 使矩阵乘法变得简单。自 Python 3.5 以来,在两个 NumPy 数组(表示矩阵)之间执行矩阵乘法的标准方式是使用 @ 运算符。
让我们使用 NumPy 执行与上面相同的计算:
import numpy as np
# 定义矩阵 A 和 B
A = np.array([[1, 2, 3],
[4, 5, 6]])
B = np.array([[7, 8],
[9, 1],
[2, 3]])
# 检查形状
print(f"A 的形状: {A.shape}") # Output: Shape of A: (2, 3)
print(f"B 的形状: {B.shape}") # Output: Shape of B: (3, 2)
# 使用 @ 运算符执行矩阵乘法
C = A @ B
print(f"\n矩阵 A:\n{A}")
print(f"矩阵 B:\n{B}")
print(f"结果 C = A @ B:\n{C}")
# 输出:
# Result C = A @ B:
# [[31 19]
# [85 55]]
print(f"C 的形状: {C.shape}") # Output: Shape of C: (2, 2)
结果与我们手动计算的结果一致。注意 NumPy 如何在内部处理行与列的点积。
您也可能会遇到 np.dot(A, B) 或 A.dot(B)。对于二维数组(矩阵),这些函数执行标准的矩阵乘法,就像 @ 运算符一样。然而,@ 运算符通常更受欢迎,因为它对于矩阵乘法是明确的,而 np.dot 对于维度超过两个的数组行为不同。为了在处理矩阵时保持清晰,请坚持使用 @。
与常规数字(标量)的乘法不同,常规数字乘法有 a×b=b×a,而矩阵乘法通常不具有可交换性。这意味着,在大多数情况下:
AB=BA
有时,即使 AB 被定义, BA 也可能甚至未被定义。例如,在我们上面的例子中,A 是 2×3 矩阵,B 是 3×2 矩阵。积 AB 被定义,结果是一个 2×2 矩阵。
那 BA 呢?这里,B 是 3×2 矩阵,A 是 2×3 矩阵。内部维度匹配(2 和 2),所以 BA 是被定义的。结果矩阵 BA 将是 3×3。
因为 AB 是 2×2 矩阵,BA 是 3×3 矩阵,它们显然不能相等。让我们用 NumPy 计算 BA 来看一看:
# 计算 BA (注意顺序)
C_BA = B @ A
print(f"\n结果 BA = B @ A:\n{C_BA}")
# 输出:
# Result BA = B @ A:
# [[ 39 54 69]
# [ 13 23 33]
# [ 14 19 24]]
print(f"BA 的形状: {C_BA.shape}") # Output: Shape of BA: (3, 3)
正如所料,BA 是一个 3×3 矩阵,与 AB 完全不同。
即使 A 和 B 是相同大小的方阵,并且 AB 和 BA 都被定义并具有相同的维度,结果通常也会不同。矩阵相乘的顺序非常重要。这对计算机图形学和机器学习等方面有重要影响,在这些方面,矩阵运算序列表示变换或计算步骤的序列。改变顺序会改变结果。
这部分内容有帮助吗?
matmul函数和@运算符用于矩阵乘法的行为,并提供示例。© 2026 ApX Machine Learning用心打造