既然你已明白如何进行矩阵乘法,接下来我们看看这种运算的一些重要特点。与普通数字(标量)的乘法不同,矩阵乘法有一些独有的行为,你需要在处理机器学习公式时加以注意。矩阵乘法通常不满足交换律这可能是与标量乘法最主要的区别。对于标量 $a$ 和 $b$,我们知道 $ab = ba$。然而,对于矩阵 $A$ 和 $B$,通常情况下 $AB = BA$ 不成立。这主要有两个原因:维度不匹配: 如果矩阵 $A$ 的维度是 $m \times n$,矩阵 $B$ 的维度是 $n \times p$,那么乘积 $AB$ 是有定义的,并且维度是 $m \times p$。然而,乘积 $BA$(维度为 $n \times p$ 的矩阵乘以维度为 $m \times n$ 的矩阵)只有在 $p = m$ 时才有定义。即使 $BA$ 有定义,它的维度也将是 $n \times n$,只有当 $m=n=p$ 时(即两者都是相同大小的方阵),其维度才与 $AB$ 的维度($m \times p$)匹配。值不同: 即使 $AB$ 和 $BA$ 都有定义且维度相同(这意味着 $A$ 和 $B$ 是相同大小的方阵),所得的矩阵通常也是不同的。我们用一个NumPy示例来说明:import numpy as np A = np.array([[1, 2], [3, 4]]) B = np.array([[5, 6], [7, 8]]) # 计算 AB AB = np.dot(A, B) print("矩阵 A:\n", A) print("\n矩阵 B:\n", B) print("\n乘积 AB:\n", AB) # 计算 BA BA = np.dot(B, A) print("\n乘积 BA:\n", BA) # 检查它们是否相等 are_equal = np.array_equal(AB, BA) print("\nAB 和 BA 是否相等?", are_equal)执行此代码将输出:矩阵 A: [[1 2] [3 4]] 矩阵 B: [[5 6] [7 8]] 乘积 AB: [[19 22] [43 50]] 乘积 BA: [[23 34] [31 46]] AB 和 BA 是否相等? False正如你所见,即使对于这些简单的2x2矩阵,$AB$ 和 $BA$ 也产生不同的结果。这种不满足交换律的特性是基本的。在矩阵方程中,务必注意乘法的顺序。矩阵乘法满足结合律虽然矩阵相乘时 哪些 矩阵的顺序很重要,但只要顺序不变,分组方式则不影响结果。对于兼容的矩阵 $A$、$B$ 和 $C$,结合律成立:$$ (AB)C = A(BC) $$这意味着你可以先计算 $A$ 乘以 $B$,然后将结果乘以 $C$;或者你可以先计算 $B$ 乘以 $C$,然后用 $A$ 乘以该结果。最终得到的矩阵将是相同的。这一性质在计算和数学证明中大量使用,因为它允许在执行一系列矩阵乘法时有灵活的选择。我们用NumPy来验证这一点:import numpy as np A = np.array([[1, 2]]) # 形状 (1, 2) B = np.array([[3, 4], [5, 6]]) # 形状 (2, 2) C = np.array([[7], [8]]) # 形状 (2, 1) # 计算 (AB)C AB = np.dot(A, B) # 形状 (1, 2) ABC1 = np.dot(AB, C) # 形状 (1, 1) print("矩阵 A:\n", A) print("\n矩阵 B:\n", B) print("\n矩阵 C:\n", C) print("\n(AB)C:\n", ABC1) # 计算 A(BC) BC = np.dot(B, C) # 形状 (2, 1) ABC2 = np.dot(A, BC) # 形状 (1, 1) print("\nA(BC):\n", ABC2) # 检查它们是否相等 are_equal = np.array_equal(ABC1, ABC2) print("\n(AB)C 和 A(BC) 是否相等?", are_equal)输出结果证实了它们是相同的:矩阵 A: [[1 2]] 矩阵 B: [[3 4] [5 6]] 矩阵 C: [[7] [8]] (AB)C: [[131]] A(BC): [[131]] (AB)C 和 A(BC) 是否相等? True矩阵乘法满足分配律矩阵乘法对矩阵加法和减法满足分配律,这与标量乘法类似。对于兼容的矩阵 $A$、$B$ 和 $C$:左分配律:$A(B + C) = AB + AC$右分配律:$(A + B)C = AC + BC$请记住,矩阵加法要求矩阵具有相同的维度。此性质对于推导中展开和简化矩阵表达式非常重要。乘法单位矩阵正如数字1是标量乘法的单位元($a \times 1 = 1 \times a = a$)一样,矩阵乘法也存在一个单位矩阵,记作 $I$。单位矩阵 $I$ 是一个方阵,其主对角线上是1,其余位置都是0。对于任意维度为 $m \times n$ 的矩阵 $A$,乘以适当的单位矩阵会使 $A$ 保持不变:$$ A I_n = A $$ $$ I_m A = A $$其中 $I_n$ 是 $n \times n$ 单位矩阵,$I_m$ 是 $m \times m$ 单位矩阵。import numpy as np A = np.array([[1, 2, 3], [4, 5, 6]]) # 形状 (2, 3) # 用于右乘的单位矩阵 (3x3) I_n = np.identity(3) print("矩阵 A: ", A) print("\n单位矩阵 I_n (3x3): ", I_n) print("\nA * I_n: ", np.dot(A, I_n)) # 用于左乘的单位矩阵 (2x2) I_m = np.identity(2) print("\n单位矩阵 I_m (2x2): ", I_m) print("\nI_m * A: ", np.dot(I_m, A))The output will show that both A * I_n and I_m * A result in the original matrix A.零矩阵的乘法性质与标量乘法中 $a \times 0 = 0$ 类似,将任意矩阵 $A$ 乘以一个兼容的零矩阵(一个只包含零的矩阵,记作 $0$)会得到一个零矩阵:$$ A 0 = 0 $$ $$ 0 A = 0 $$所得零矩阵的维度取决于矩阵 $A$ 和所用零矩阵的维度。转置的性质一个重要的性质将矩阵乘法与转置运算关联起来。对于兼容的矩阵 $A$ 和 $B$:$$ (AB)^T = B^T A^T $$请注意,当转置应用于乘积时,顺序会颠倒。此性质在处理机器学习中的优化问题和导数时经常出现。与标量乘法的相互作用标量乘法与矩阵乘法的相互作用是可预测的。对于标量 $c$ 和兼容的矩阵 $A$ 和 $B$:$$ c(AB) = (cA)B = A(cB) $$你可以在进行矩阵乘法之前将标量与任一矩阵相乘,或者将矩阵乘法的结果乘以该标量。结果是相同的。了解这些性质不仅对于正确执行计算很重要,而且对于处理机器学习算法中遇到的矩阵方程也很重要,例如线性回归、主成分分析(PCA)和神经网络。它们构成了线性代数语言的语法规则。