让我们来看看另一个基本矩阵运算:转置。矩阵的加法、减法和标量乘法都涉及元素级别的计算,而转置则是一种结构性操作。它通过沿其主对角线翻转来重新排列矩阵的元素。这看起来可能只是一种简单的变换,但在机器学习的各种数据处理任务和数学公式中,它却出奇地有用。什么是矩阵转置?矩阵的转置是通过交换其行和列获得的。如果你有一个矩阵 $A$,它的转置记作 $A^T$。$A$ 的第一行变为 $A^T$ 的第一列,$A$ 的第二行变为 $A^T$ 的第二列,依此类推。更正式地讲,如果 $A$ 是一个 $m \times n$ 矩阵(意味着它有 $m$ 行和 $n$ 列),那么它的转置 $A^T$ 将是一个 $n \times m$ 矩阵。矩阵 $A$ 中第 $i$ 行第 $j$ 列的元素(记作 $A_{ij}$)变为 $A^T$ 中第 $j$ 行第 $i$ 列的元素。我们可以将这种关系表示为:$$ (A^T){ji} = A{ij} $$让我们来看一个具体例子。考虑以下 $2 \times 3$ 矩阵 $A$:$$ A = \begin{bmatrix} 5 & 0 & 7 \ 1 & -2 & 9 \end{bmatrix} $$为了求其转置 $A^T$,我们取第一行 $[5, 0, 7]$ 并使其成为第一列。然后取第二行 $[1, -2, 9]$ 并使其成为第二列。得到的矩阵 $A^T$ 是一个 $3 \times 2$ 的矩阵:$$ A^T = \begin{bmatrix} 5 & 1 \ 0 & -2 \ 7 & 9 \end{bmatrix} $$注意维度是如何从 $2 \times 3$ 翻转为 $3 \times 2$ 的。元素 $A_{12}$(即 0)移动到了位置 $(A^T){21}$。元素 $A{23}$(即 9)移动到了位置 $(A^T)_{32}$。NumPy 中的矩阵转置NumPy 使计算转置变得非常直接。你可以使用 NumPy 数组的 .T 属性或 numpy.transpose() 函数。让我们在 NumPy 中尝试我们的示例矩阵 $A$:import numpy as np # 定义矩阵 A A = np.array([ [5, 0, 7], [1, -2, 9] ]) print("原始矩阵 A:") print(A) print("A 的形状:", A.shape) # 使用 .T 属性计算转置 A_transpose = A.T print("\n转置 A^T:") print(A_transpose) print("A^T 的形状:", A_transpose.shape) # 你也可以使用 np.transpose() 函数 A_transpose_func = np.transpose(A) print("\n使用 np.transpose(A) 进行转置:") print(A_transpose_func) print("形状:", A_transpose_func.shape)运行此代码将生成:Original Matrix A: [[ 5 0 7] [ 1 -2 9]] Shape of A: (2, 3) Transpose A^T: [[ 5 1] [ 0 -2] [ 7 9]] Shape of A^T: (3, 2) Transpose using np.transpose(A): [[ 5 1] [ 0 -2] [ 7 9]] Shape: (3, 2)如你所见,两种方法都得到相同的结果,并且形状确认了维度已经交换。.T 属性通常更方便,因为它更简洁。转置的性质转置操作有几个有用的性质:转置的转置: 进行两次转置会返回原始矩阵。 $$ (A^T)^T = A $$和的转置: 两个矩阵和的转置等于它们各自转置的和。 $$ (A + B)^T = A^T + B^T $$ (这要求 $A$ 和 $B$ 具有相同的维度)。标量乘法的转置: 矩阵与标量乘积的转置等于该标量乘以矩阵的转置。 $$ (cA)^T = cA^T $$乘积的转置: 两个矩阵乘积的转置是它们转置的乘积,但顺序是相反的。这是一个重要的性质,我们将在讨论矩阵乘法时再次谈到。 $$ (AB)^T = B^T A^T $$向量转置当你转置一个向量时会发生什么?请记住,我们通常将向量表示为列矩阵(一个 $n \times 1$ 矩阵)或有时是行矩阵(一个 $1 \times n$ 矩阵)。转置列向量会将其变为行向量,转置行向量则会将其变为列向量。在 NumPy 中,如果你将向量表示为二维数组(其中一个维度的大小为 1),这会如预期般工作:# 列向量 (3x1 矩阵) col_vec = np.array([[10], [20], [30]]) print("列向量 (3x1):") print(col_vec) print("形状:", col_vec.shape) # 转置为行向量 (1x3 矩阵) row_vec = col_vec.T print("\n转置为行向量 (1x3):") print(row_vec) print("形状:", row_vec.shape) # 再次转置为列向量 (3x1 矩阵) col_vec_again = row_vec.T print("\n再次转置为列向量 (3x1):") print(col_vec_again) print("形状:", col_vec_again.shape)Output:Column Vector (3x1): [[10] [20] [30]] Shape: (3, 1) Transposed to Row Vector (1x3): [[10 20 30]] Shape: (1, 3) Transposed back to Column Vector (3x1): [[10] [20] [30]] Shape: (3, 1)关于一维 NumPy 数组的重要说明: 如果你将向量表示为一维 NumPy 数组(例如,np.array([10, 20, 30])),直接应用 .T 属性没有效果。这是因为一维数组没有像二维数组那样严格的行和列可以交换。它的形状仅仅是 (n,)。# 一维 NumPy 数组 vec_1d = np.array([10, 20, 30]) print("一维数组:", vec_1d) print("形状:", vec_1d.shape) print("应用 .T:", vec_1d.T) # 无变化 print("应用 .T 后的形状:", vec_1d.T.shape)Output:1D Array: [10 20 30] Shape: (3,) Applying .T: [10 20 30] Shape after .T: (3,)如果你需要将一维数组视为行向量或列向量进行矩阵乘法或明确转置等操作,你通常需要先使用 reshape(1, -1)(用于行向量)或 reshape(-1, 1)(用于列向量)等方法将其重塑为二维数组。为何使用转置?转置操作经常出现在线性代数公式和数据处理任务中:数据表示: 数据集有时会将特征作为行,样本作为列,或者反之。转置可以让你轻松地在这两种排列方式之间切换。数学公式: 某些计算本身就需要转置矩阵。例如,两个列向量 $u$ 和 $v$ 的点积可以通过转置写成矩阵乘法的形式:$u^T v$。机器学习模型中的一些公式,例如线性回归中的正规方程 ($(X^T X)^{-1} X^T y$),严重依赖转置。内积和外积: 当使用矩阵乘法规则表示时,计算向量的内积(如点积)和外积通常涉及转置。掌握转置是理解机器学习中线性代数运作方式的又一步。它是一个应用广泛的简单概念。接下来,我们将处理最复杂的运算:矩阵乘法。