1

我目前使用 numpy.linalg 的 svd 函数在大矩阵(准确地说是图像)上计算 SVD。我发现的文档和示例似乎都表明返回的 Sigma 值按降序排序(暗示 U 和 V^T 的正确排序)。

但是,在我的测试中,sigma 值似乎是无序的。所以我的问题是,由于某种原因,我的 linalg 是否出了问题(我知道极不可能),或者它是否只是将 sigma 的返回无序?

后续问题是对 sigma 进行排序的最佳方法,以便 U 和 V^T 中的顺序也反映变化。

4

1 回答 1

2

由于linalg.svd只是 LAPACKdgesdd的一个接口,因此应该对奇异值进行排序。

>>> import numpy as np
>>> A = np.random.randn(2400,3600)
>>> U, s, V = np.linalg.svd(A, full_matrices=False)
>>> np.allclose(A, np.dot(U*s, V))
True
>>> (s[:-1] >= s[1:]).all()
True

如果您得到无序的结果,请检查结果是否正确,如上例所示。如果不是,您可能有一个lapack 错误或(不太可能)一个 numpy 错误。

于 2012-09-14T13:41:34.910 回答