我正在使用numpy.linalg的svd函数在大矩阵(图像,确切地说)上计算SVD。我发现的文档和示例似乎都表明返回的Sigma值按降序排列(暗示U和V ^ T的正确排序)。
然而,在我的测试中,sigma值显得无序。所以我的问题是,由于某些原因,我的linalg中出现了什么问题(我不太可能知道),或者它是否只是将sigma作为无序返回?
后续问题是对sigma进行排序的最佳方式,以便U和V ^ T中的顺序也反映出变化。
答案 0 :(得分:1)
由于linalg.svd
只是LAPACK dgesdd
的接口,因此应该对单数值进行排序。
>>> 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 bug或(不太可能)一个numpy bug。