用Python求解奇异值分解(SVD)

用Python求解奇异值分解(SVD),python,linear-algebra,idl,svd,idl-programming-language,Python,Linear Algebra,Idl,Svd,Idl Programming Language,我正在尝试将IDL程序翻译成Python。我必须通过以下方式解决SVD的结果 from scipy.linalg import svd A = [[1,2,3],[4,5,6]] b = [4,4,5] u,w,v = svd(A) 这可以很好地工作,并且可以很好地从IDL翻译过来。下一步是IDL(!) python和IDL中的u几乎相同(对于其他矩阵也是如此)。唯一的区别是维度,其中IDL的矩阵更大,但有很多零。在这种情况下,Python的矩阵似乎更为压缩 有人知道类似的Python吗 如

我正在尝试将IDL程序翻译成Python。我必须通过以下方式解决
SVD
的结果

from scipy.linalg import svd
A = [[1,2,3],[4,5,6]]
b = [4,4,5]

u,w,v = svd(A)
这可以很好地工作,并且可以很好地从IDL翻译过来。下一步是IDL(!)

python和IDL中的
u
几乎相同(对于其他矩阵也是如此)。唯一的区别是维度,其中IDL的矩阵更大,但有很多零。在这种情况下,Python的矩阵似乎更为压缩

有人知道类似的Python吗


如果有人需要它,这里是使用IDL中的
SVDC
SVSOL
的手册,您可以通过SVD分解来解决线性最小二乘问题。这是通过
numpy.linalg.lstsq
函数在
numpy
中完成的。(无需先计算奇异值分解,然后再反解。)

请注意,
b
的长度必须与
A
的行数相同,因此您的示例是错误的。为了让舒尔知道我正确解释了IDL语义,以下是
svsol
中的示例:


您不能直接使用:?不,我正在IDL中寻找类似于
svsol
的东西。我现在采用的方法就是用这种方法,看起来效果非常好。我想我就用最小二乘法吧。出于好奇,您能告诉我SVD(如果有)比
lstsq
的优势吗。非常感谢你的帮助;这是非常精确的@DanielThaagaardAndreasen在内部
np.linalg.lstsq
调用LAPACK,而LAPACK又是基于SVD的,因此在概念上没有区别。这意味着通常的
dgelsd
比完整SVD和随后的反向求解速度更快。有关更多信息,请查看LAPACK。非常感谢您的帮助和时间:)
x = svsol(u,w,v,b)
>>> import numpy as np
>>> A = np.array([[1,2,3],[4,5,6]])
>>> b = np.array([4,4])
>>> x, _, _, _ = np.linalg.lstsq(A,b)
>>> x
array([-2.,  0.,  2.])
>>> np.dot(A,x)
array([ 4.,  4.])
>>> A = np.array(
... [[1.0, 2.0, -1.0, 2.5],
...  [1.5, 3.3, -0.5, 2.0],
...  [3.1, 0.7,  2.2, 0.0],
...  [0.0, 0.3, -2.0, 5.3],
...  [2.1, 1.0,  4.3, 2.2],
...  [0.0, 5.5,  3.8, 0.2]])
>>> B = np.array([0.0, 1.0, 5.3, -2.0, 6.3, 3.8])
>>> x, _, _, _ = np.linalg.lstsq(A,B)
>>> print x
[ 1.00095058  0.00881193  0.98417587 -0.01009547]