如我们所见,矩阵是组织数据和描述线性变换的重要工具。虽然任何数字网格都构成矩阵,但某些类型的矩阵具有特殊结构和性质,使其在机器学习中尤为有用。识别这些类型有助于更好地理解算法,并常带来明显的计算效率提升。下面介绍一些您会经常遇到的常见类型。方阵最基本的分类是方阵,它简单地说就是行数和列数相等($n \times n$)。许多重要性质,如矩阵逆、行列式、特征值和特征向量(我们将在后面介绍),主要为方阵定义。它们常表示给定维度空间内的变换,或方程数量与未知数数量相等的系统。单位矩阵单位矩阵,表示为 $I$(或 $I_n$ 以指定 $n \times n$ 大小),是标量乘法中数字1的矩阵对应物。它是一个方阵,主对角线(从左上到右下)上均为1,其余位置均为0。$$ I_3 = \begin{bmatrix} 1 & 0 & 0 \ 0 & 1 & 0 \ 0 & 0 & 1 \end{bmatrix} $$其主要性质是,任何矩阵 $A$ 乘以适当大小的单位矩阵后,矩阵 $A$ 保持不变: $AI = A$ 和 $IA = A$。 同样,向量 $x$ 乘以 $I$ 后,向量保持不变:$Ix = x$。在机器学习中,单位矩阵可代表不进行任何操作的变换,作为基准或初始状态。它在定义中也起着基本作用,例如矩阵逆的定义。您可以使用NumPy中的 np.identity() 或 np.eye() 创建单位矩阵:import numpy as np # 创建一个3x3单位矩阵 I = np.identity(3) print(I) # 输出: # [[1. 0. 0.] # [0. 1. 0.] # [0. 0. 1.]] # np.eye() 类似但更灵活(可创建非方阵) I_eye = np.eye(3) print(I_eye)对角矩阵对角矩阵是一种方阵,其中所有非对角线元素均为零。主对角线元素可以是任意值,包括零。单位矩阵是对角矩阵的一个特例。$$ D = \begin{bmatrix} d_1 & 0 & 0 \ 0 & d_2 & 0 \ 0 & 0 & d_3 \end{bmatrix} $$对角矩阵在计算上非常方便。涉及对角矩阵的矩阵乘法会大大简化,通常只是对另一个矩阵的行或列进行缩放。对角矩阵的逆(如果存在)通过取每个对角线元素的倒数即可轻松求得。在机器学习中,对角矩阵常表示沿坐标轴的缩放变换。例如,对角协方差矩阵意味着特征之间不相关。它们也作为奇异值分解(SVD)中的一个核心组成部分($\Sigma$)出现。NumPy使用 np.diag() 可以轻松创建对角矩阵:# 从列表或数组创建对角矩阵 diag_elements = [2, -1, 5] D = np.diag(diag_elements) print(D) # 输出: # [[ 2 0 0] # [ 0 -1 0] # [ 0 0 5]] # 从现有矩阵中提取对角线元素 diag_extracted = np.diag(D) print(diag_extracted) # 输出: [ 2 -1 5]对称矩阵对称矩阵是一种方阵,它等于其自身的转置。也就是说,$A = A^T$。这意味着第 $i$ 行第 $j$ 列的元素与第 $j$ 行第 $i$ 列的元素相同($a_{ij} = a_{ji}$)。$$ S = \begin{bmatrix} 1 & 7 & -2 \ 7 & 3 & 0 \ -2 & 0 & 5 \end{bmatrix} \quad \text{是对称矩阵,因为 } S = S^T $$对称矩阵在机器学习中非常重要。例子包括:协方差矩阵:描述特征对之间的方差和协方差。始终是对称的。相关矩阵:协方差矩阵的标准化版本。始终是对称的。核矩阵:在支持向量机(SVM)及其他核方法中用于衡量相似度。通常是对称的。Hessian矩阵:用于优化算法的二阶偏导数矩阵。在某些条件下是对称的。对称矩阵的一个重要性质是其特征值总是实数,对应于不同特征值的特征向量是正交的。这个性质是主成分分析(PCA)等方法的基础。您可以在NumPy中检查对称性:S = np.array([[1, 7, -2], [7, 3, 0], [-2, 0, 5]]) is_symmetric = np.allclose(S, S.T) # 使用 np.allclose 进行浮点数比较 print(f"S是对称的吗? {is_symmetric}") # 输出: S是对称的吗? True NotSymmetric = np.array([[1, 7], [-7, 3]]) print(f"NotSymmetric是对称的吗? {np.allclose(NotSymmetric, NotSymmetric.T)}") # 输出: NotSymmetric是对称的吗? False转置矩阵我们刚刚使用转置定义了对称矩阵。矩阵 $A$ 的转置,表示为 $A^T$,是通过交换其行和列获得的。如果 $A$ 是一个 $m \times n$ 矩阵,$A^T$ 将是一个 $n \times m$ 矩阵,其中 $(A^T){ij} = A{ji}$。$$ A = \begin{bmatrix} 1 & 2 & 3 \ 4 & 5 & 6 \end{bmatrix} \quad \implies \quad A^T = \begin{bmatrix} 1 & 4 \ 2 & 5 \ 3 & 6 \end{bmatrix} $$转置操作有几个性质,特别是 $(AB)^T = B^T A^T$ 和 $(A+B)^T = A^T + B^T$。它常在机器学习公式和推导中出现,例如线性回归的正规方程 ($X^T X \hat{\beta} = X^T y$),以及在处理数据表示时。在NumPy中,转置可以轻松通过 .T 属性或 np.transpose() 函数访问:A = np.array([[1, 2, 3], [4, 5, 6]]) A_transpose = A.T print(A_transpose) # 输出: # [[1 4] # [2 5] # [3 6]] # 使用函数实现相同效果 A_transpose_func = np.transpose(A) print(A_transpose_func)逆矩阵对于一个方阵 $A$,其逆矩阵,表示为 $A^{-1}$,是一个与 $A$ 相乘后得到单位矩阵的矩阵: $$AA^{-1} = A^{-1}A = I$$ 一个矩阵必须是方阵才能有逆,但并非所有方阵都有逆。有逆矩阵的矩阵称为可逆矩阵或非奇异矩阵。如果逆矩阵不存在,则该矩阵称为不可逆矩阵或奇异矩阵。逆矩阵是否存在由一个称为行列式的值决定(在第3章中讨论)。逆矩阵对于解 $Ax = b$ 形式的线性方程组很重要。如果 $A$ 可逆,则唯一解为 $x = A^{-1}b$。虽然这在数学上很优美,但与解决 $Ax=b$ 的其他方法相比,对于大型矩阵,直接计算逆矩阵通常数值不稳定且计算成本高昂。我们将在下一章进一步说明。性质包括 $(AB)^{-1} = B^{-1}A^{-1}$ 和 $(A^T)^{-1} = (A^{-1})^T$。NumPy提供了 np.linalg.inv() 用于计算逆矩阵:A = np.array([[1, 2], [3, 4]]) try: A_inv = np.linalg.inv(A) print("矩阵A的逆:") print(A_inv) # 验证: A @ A_inv 应该接近单位矩阵 identity_check = A @ A_inv print("\n验证 (A @ A_inv):") print(identity_check) print(f"接近单位矩阵吗? {np.allclose(identity_check, np.eye(2))}") except np.linalg.LinAlgError: print("矩阵A是奇异的,没有逆。") # 奇异矩阵的例子 B = np.array([[1, 2], [2, 4]]) try: B_inv = np.linalg.inv(B) print(B_inv) except np.linalg.LinAlgError: print("\n矩阵B是奇异的。") # 输出: # Inverse of A: # [[-2. 1. ] # [ 1.5 -0.5]] # # Verification (A @ A_inv): # [[1.0000000e+00 0.0000000e+00] # [8.8817842e-16 1.0000000e+00]] # Is close to identity? True # # Matrix B is singular.如前所述,对于求解 $Ax=b$,通常更推荐使用 np.linalg.solve(A, b) 而不是显式计算逆矩阵。正交矩阵正交矩阵 $Q$ 是一种方阵,其列(和行)构成一组标准正交向量。这意味着每个列向量的长度(L2范数)为1,并且每个列向量都与其他所有列向量正交(点积为零)。正交矩阵的一个主要性质是其转置等于其逆: $$Q^T Q = Q Q^T = I \quad \implies \quad Q^{-1} = Q^T$$ 这使得涉及逆的计算变得简单。向量乘以正交矩阵相当于对向量进行刚性旋转和/或反射。重要的是,这些变换保持向量的长度和它们之间的角度不变:$||Qx||_2 = ||x||_2$。正交矩阵在数值计算中很有用,因为它们本身稳定且不放大误差。它们在主成分分析(PCA)等算法(其中对称矩阵的特征向量矩阵可以选择为正交的)以及QR分解和SVD等矩阵分解中扮演重要角色。# 二维旋转矩阵的例子(它是正交的) theta = np.pi / 4 # 45 degrees Q = np.array([[np.cos(theta), -np.sin(theta)], [np.sin(theta), np.cos(theta)]]) print("正交矩阵Q(45度旋转):") print(Q) # 验证正交性: Q^T @ Q 应该为单位矩阵 identity_check = Q.T @ Q print("\n验证 (Q.T @ Q):") print(identity_check) print(f"接近单位矩阵吗? {np.allclose(identity_check, np.eye(2))}") # 验证逆矩阵等于转置矩阵 Q_inv = np.linalg.inv(Q) print("\nQ的逆矩阵:") print(Q_inv) print(f"逆矩阵接近转置矩阵吗? {np.allclose(Q_inv, Q.T)}") # Output: # Orthogonal matrix Q (45-degree rotation): # [[ 0.70710678 -0.70710678] # [ 0.70710678 0.70710678]] # # Verification (Q.T @ Q): # [[1. 0.] # [0. 1.]] # Is close to identity? True # # Inverse of Q: # [[ 0.70710678 0.70710678] # [-0.70710678 0.70710678]] # Is inverse close to transpose? True理解这些常见矩阵类型有助于简化问题,理解算法行为(例如PCA依赖对称协方差矩阵),并采用高效的计算实现。随着学习的推进,您会发现这些结构在各种机器学习场景中反复出现。