特征分解通常应用于方阵,以找到在矩阵表示的变换下保持不变(仅进行缩放)的方向(特征向量)。对于矩阵$A$,特征值方程是$Ax = \lambda x$。如果$A$是对称的,它的特征分解形式为$A = V \Lambda V^T$,其中$V$包含正交特征向量,$\Lambda$是对角特征值矩阵。奇异值分解(SVD),$A = U\Sigma V^T$,提供了一种相关但更普遍的方法来分解任意矩阵$A$,无论是方阵还是矩形矩阵。当我们考虑矩阵$A^T A$和$A A^T$时,奇异值分解与特征分解之间的联系就会变得清晰。这些矩阵总是方阵和对称的(或者更准确地说,是半正定的),这意味着它们的特征分解性质良好。让我们看看SVD的组成部分($U$,$\Sigma$, $V$)与这些特定矩阵的特征分解如何关联。通过$A^T A$建立关联考虑矩阵$A^T A$。让我们将$A$的SVD代入此表达式: $A = U \Sigma V^T$ $A^T = (U \Sigma V^T)^T = V \Sigma^T U^T$现在,将$A^T$乘以$A$: $$ A^T A = (V \Sigma^T U^T) (U \Sigma V^T) $$由于$U$是正交矩阵,$U^T U = I$(单位矩阵)。表达式简化为: $$ A^T A = V \Sigma^T (U^T U) \Sigma V^T $$ $$ A^T A = V (\Sigma^T \Sigma) V^T $$仔细观察这个结果:$A^T A = V (\Sigma^T \Sigma) V^T$。这正是对称矩阵$A^T A$的特征分解形式。$V$的列是$A^T A$的特征向量。矩阵$\Sigma^T \Sigma$是对角矩阵。其对角线上的元素是$A^T A$的特征值。$\Sigma^T \Sigma$的对角线元素是什么?如果$\Sigma$的对角线上有奇异值$\sigma_1, \sigma_2, ..., \sigma_r$(其中$r$是$A$的秩),那么$\Sigma^T \Sigma$是一个$n \times n$的对角矩阵,其对角线上是$\sigma_1^2, \sigma_2^2, ..., \sigma_r^2$,后跟零。因此,$A$的右奇异向量($V$的列)是$A^T A$的特征向量。$A$的平方奇异值($\sigma_i^2$)是$A^T A$的特征值。通过$A A^T$建立关联现在让我们对矩阵$A A^T$进行类似分析: $$ A A^T = (U \Sigma V^T) (V \Sigma^T U^T) $$由于$V$也是正交矩阵,$V^T V = I$。表达式简化为: $$ A A^T = U \Sigma (V^T V) \Sigma^T U^T $$ $$ A A^T = U (\Sigma \Sigma^T) U^T $$同样,这个结果$A A^T = U (\Sigma \Sigma^T) U^T$是对称矩阵$A A^T$的特征分解。$U$的列是$A A^T$的特征向量。矩阵$\Sigma \Sigma^T$是对角矩阵。其对角线上的元素是$A A^T$的特征值。$\Sigma \Sigma^T$的对角线元素也是平方奇异值$\sigma_1^2, \sigma_2^2, ..., \sigma_r^2$,后跟零(这次是一个$m \times m$矩阵)。因此,$A$的左奇异向量($U$的列)是$A A^T$的特征向量。$A$的平方奇异值($\sigma_i^2$)也是$A A^T$的特征值。关联总结SVD组成部分 ($A = U\Sigma V^T$)与特征分解的关联奇异值 ($\sigma_i$)$A^T A$(和$A A^T$)的非零特征值的平方根右奇异向量 ($V$)$A^T A$的特征向量左奇异向量 ($U$)$A A^T$的特征向量这种关联在以下几个方面有重要意义:普适性:它显现了SVD如何通过对称矩阵$A^T A$和$A A^T$,将特征分解(寻找特殊方向和缩放因子)的思路从方阵扩展到任意矩形矩阵。计算:尽管理论上可以通过找到$A^T A$和$A A^T$的特征分解来计算SVD,但直接计算SVD的数值方法通常更稳定,并在实际中更受欢迎。机器学习中的解释:在许多数据分析情境中,$A$将中心化数据点表示为行。矩阵$A^T A$与特征的协方差矩阵密切相关。协方差矩阵的特征分解是主成分分析(PCA)的核心。因此,从数据矩阵$A$的SVD得到的右奇异向量($V$)和奇异值($\sigma_i$)与主成分以及它们捕获的方差直接关联。具体来说,右奇异向量$V$给出主方向,而平方奇异值$\sigma_i^2$(经过适当缩放)给出沿这些方向的方差。NumPy实践演示让我们使用Python的NumPy库验证这种关联。我们将创建一个示例矩阵$A$,计算它的SVD,然后计算$A^T A$和$A A^T$的特征分解,以查看组成部分是否如预期一致。import numpy as np # 设置打印选项,提高可读性 np.set_printoptions(suppress=True, precision=4) # 创建一个非方阵示例矩阵 A A = np.array([[1, 2, 3], [4, 5, 6]]) # A 是 2x3 print("矩阵 A:\n", A) # 1. 计算 A 的 SVD # U 将是 2x2,S 将包含 2 个奇异值,Vh (V.T) 将是 3x3 U, s, Vh = np.linalg.svd(A) V = Vh.T # 转置 Vh 得到 V Sigma_squared = s**2 print("\nSVD 结果:") print("U (左奇异向量):\n", U) print("奇异值 (s):", s) print("Sigma^2 (平方奇异值):", Sigma_squared) print("V (右奇异向量):\n", V) # 2. 计算 A.T @ A (A^T A) 的特征分解 ATA = A.T @ A # ATA 是 3x3 print("\n矩阵 A^T A:\n", ATA) # 对称矩阵使用 eigh(返回排序后的特征值/向量) eigenvalues_ATA, eigenvectors_ATA = np.linalg.eigh(ATA) # eigh 返回的特征值是从小到大排序的,反转它们 eigenvalues_ATA = eigenvalues_ATA[::-1] eigenvectors_ATA = eigenvectors_ATA[:, ::-1] print("\nA^T A 的特征分解:") print("特征值(应与 Sigma^2 匹配):", eigenvalues_ATA) print("特征向量(应与 V 的列匹配):\n", eigenvectors_ATA) # 3. 计算 A @ A.T (A A^T) 的特征分解 AAT = A @ A.T # AAT 是 2x2 print("\n矩阵 A A^T:\n", AAT) eigenvalues_AAT, eigenvectors_AAT = np.linalg.eigh(AAT) # 反转排序顺序以保持一致性 eigenvalues_AAT = eigenvalues_AAT[::-1] eigenvectors_AAT = eigenvectors_AAT[:, ::-1] print("\nA A^T 的特征分解:") print("特征值(应与 Sigma^2 匹配):", eigenvalues_AAT) print("特征向量(应与 U 的列匹配):\n", eigenvectors_AAT) # 验证检查(允许微小数值差异) print("\n验证:") # 检查特征值 print("Sigma^2 大致匹配 A^T A 的特征值:", np.allclose(Sigma_squared, eigenvalues_ATA[:len(s)])) print("Sigma^2 大致匹配 A A^T 的特征值:", np.allclose(Sigma_squared, eigenvalues_AAT[:len(s)])) # 检查特征向量(注意:特征向量仅在符号上唯一) # 检查 V 的列是否与 ATA 的特征向量(或其负值)匹配 print("V 的列大致匹配 A^T A 的特征向量:", np.allclose(np.abs(V[:, :len(s)]), np.abs(eigenvectors_ATA[:, :len(s)]))) # 检查 U 的列是否与 AAT 的特征向量(或其负值)匹配 print("U 的列大致匹配 A A^T 的特征向量:", np.allclose(np.abs(U), np.abs(eigenvectors_AAT))) 运行此代码显现了这种关联:$A^T A$和$A A^T$的非零特征值都等于奇异值的平方($\sigma_i^2$)。注意,如果$A$是矩形矩阵,$A^T A$可能比$A A^T$有更多的特征值(反之亦然),但非零特征值将与$\sigma_i^2$匹配。$A^T A$的特征向量对应于$V$的列(右奇异向量)。$A A^T$的特征向量对应于$U$的列(左奇异向量)。请记住,特征向量(和奇异向量)在符号($\pm 1$)上是唯一的。因此,在比较像$V$这样的向量和$A^T A$的特征向量时,你可能会发现一些对应的列是彼此的负值。这是完全正常的,并且np.allclose比较绝对值可以处理这种情况。SVD与特征分解的这种紧密关联使SVD成为一项基本方法。它使用对称矩阵特征分解的良好性质,为任意矩阵提供了一种强大的分解方法,在理解数据结构、降维等方面有直接应用。