趋近智
特征分解通常应用于方阵,以找到在矩阵表示的变换下保持不变(仅进行缩放)的方向(特征向量)。对于矩阵A,特征值方程是Ax=λx。如果A是对称的,它的特征分解形式为A=VΛVT,其中V包含正交特征向量,Λ是对角特征值矩阵。
奇异值分解(SVD),A=UΣVT,提供了一种相关但更普遍的方法来分解任意矩阵A,无论是方阵还是矩形矩阵。当我们考虑矩阵ATA和AAT时,奇异值分解与特征分解之间的联系就会变得清晰。这些矩阵总是方阵和对称的(或者更准确地说,是半正定的),这意味着它们的特征分解性质良好。
让我们看看SVD的组成部分(U,Σ, V)与这些特定矩阵的特征分解如何关联。
考虑矩阵ATA。让我们将A的SVD代入此表达式: A=UΣVT AT=(UΣVT)T=VΣTUT
现在,将AT乘以A: ATA=(VΣTUT)(UΣVT)
由于U是正交矩阵,UTU=I(单位矩阵)。表达式简化为: ATA=VΣT(UTU)ΣVT ATA=V(ΣTΣ)VT
仔细观察这个结果:ATA=V(ΣTΣ)VT。这正是对称矩阵ATA的特征分解形式。
ΣTΣ的对角线元素是什么?如果Σ的对角线上有奇异值σ1,σ2,...,σr(其中r是A的秩),那么ΣTΣ是一个n×n的对角矩阵,其对角线上是σ12,σ22,...,σr2,后跟零。
因此,A的右奇异向量(V的列)是ATA的特征向量。A的平方奇异值(σi2)是ATA的特征值。
现在让我们对矩阵AAT进行类似分析: AAT=(UΣVT)(VΣTUT)
由于V也是正交矩阵,VTV=I。表达式简化为: AAT=UΣ(VTV)ΣTUT AAT=U(ΣΣT)UT
同样,这个结果AAT=U(ΣΣT)UT是对称矩阵AAT的特征分解。
ΣΣT的对角线元素也是平方奇异值σ12,σ22,...,σr2,后跟零(这次是一个m×m矩阵)。
因此,A的左奇异向量(U的列)是AAT的特征向量。A的平方奇异值(σi2)也是AAT的特征值。
| SVD组成部分 (A=UΣVT) | 与特征分解的关联 |
|---|---|
| 奇异值 (σi) | ATA(和AAT)的非零特征值的平方根 |
| 右奇异向量 (V) | ATA的特征向量 |
| 左奇异向量 (U) | AAT的特征向量 |
这种关联在以下几个方面有重要意义:
让我们使用Python的NumPy库验证这种关联。我们将创建一个示例矩阵A,计算它的SVD,然后计算ATA和AAT的特征分解,以查看组成部分是否如预期一致。
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)))
运行此代码显现了这种关联:
请记住,特征向量(和奇异向量)在符号(±1)上是唯一的。因此,在比较像V这样的向量和ATA的特征向量时,你可能会发现一些对应的列是彼此的负值。这是完全正常的,并且np.allclose比较绝对值可以处理这种情况。
SVD与特征分解的这种紧密关联使SVD成为一项基本方法。它使用对称矩阵特征分解的良好性质,为任意矩阵提供了一种强大的分解方法,在理解数据结构、降维等方面有直接应用。
简洁的语法。内置调试功能。从第一天起就可投入生产。
为 ApX 背后的 AI 系统而构建
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造