奇异矩阵的不良SVD重建

计算科学 线性代数 Python 麻木的 svd
2021-11-26 10:10:24

我正在尝试使用 计算此矩阵的奇异分解numpy.linalg.svd

然而,从 SVD 重构矩阵的重构效果很差——特别是,重构中的第一行和第二列远小于原始矩阵。

u, w, vt = np.linalg.svd(M)
np.allclose(M, np.dot(u, np.dot(np.diag(w), vt)))

>> False

矩阵是奇异的(w[-1]为零),并且最大的奇异值远大于其他非零值(3e+24vs7e-2为下一个最大值)。

-

我是否应该期望从 SVD 的重建对于条件如此恶劣的矩阵来说很差?他们还有其他更稳定的方法可以计算 SVD 吗?

-

我计算 SVD 的原因是对M我计算的伪逆的诊断numpy.linalg.pinv,它应该返回 Moore-Penrose 伪逆。据我了解,这个特定的伪逆应该是对称的,因为M它是对称的,但事实并非如此。我的假设是这是因为numpy.linalg.pinv计算的 SVD 存在问题。

1个回答

SVD 的算法,或多或少是每个基于正交变换的经典线性代数算法,是范数后向稳定的,即,应该保证USVAA=O(u),其中范数是欧几里得范数,是机器精度,“ ”表示 u 中的一阶项矩阵维度中的多项式界定。uO(u)u

特别是,这个范数界限并不能保证所有元素都是接近的:例如,比较 这两个向量在范数上彼此非常接近,所以非常小,但它们在元素上不是那么大。

a=[10151]vs.b=[10151].
abb

numpy.allclose按元素比较,而不是按标准比较。