为何scipy.linalg.svd的左矩阵U与scipy.linalg.eig的特征向量不同?
为什么对称正定矩阵SVD得到的U矩阵与特征向量符号相反?
这是完全正常的现象,核心原因在于特征向量的符号不唯一性:
- 根据特征向量的定义,若$\mathbf{v}$是矩阵$A$对应特征值$\lambda$的特征向量,那么任意非零标量$k$乘以$\mathbf{v}$(即$k\mathbf{v}$)也同样是$A$对应$\lambda$的特征向量。当$k=-1$时,特征向量的所有元素符号取反,这完全符合特征向量的数学定义,两者都是有效的特征向量。
对于对称正定矩阵,SVD分解得到的$U$矩阵确实由特征向量构成,但SVD与特征值分解的数值实现算法不同:
scipy.linalg.svd()和scipy.linalg.eig()在计算过程中,内部的迭代策略、归一化方式可能存在差异,导致最终输出的特征向量选择了相反的符号方向,但这并不影响它们的正确性。
结合你的代码示例验证:
import scipy import numpy as np mat = np.array([[3,2],[2,3]]) U, S, Vh = scipy.linalg.svd(mat) eigenvalues, eigenvectors = scipy.linalg.eig(mat) # 验证U的第一列是特征向量 print(mat @ U[:,0]) print(eigenvalues[0] * U[:,0]) # 输出均为 [-3.53553391 -3.53553391],符合特征方程 # 验证eigenvectors的第一列是特征向量 print(mat @ eigenvectors[:,0]) print(eigenvalues[0] * eigenvectors[:,0]) # 输出均为 [3.53553391 3.53553391],同样符合特征方程
可见两者只是符号相反,都满足特征向量的核心要求:矩阵与向量的乘积等于特征值与向量的乘积。
内容的提问来源于stack exchange,提问作者Redowan Sakib
相关产品推荐
相关产品推荐

