解决Python中的奇异值分解(SVD)
作者:互联网
我正在尝试将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很好地翻译.下一步是IN IDL(!)
x = svsol(u,w,v,b)
python和IDL中的u几乎相同(其他矩阵也是如此).唯一的区别是维度,其中IDL的矩阵较大,但有很多零.在这种情况下,似乎Python的矩阵更加压缩.
有谁知道类似的Python知识.
如果有人需要,这里是svsol
的手册.
解决方法:
使用IDL中的SVDC和SVSOL,您可以通过SVD分解解决线性最小二乘问题.这是通过numpy.linalg.lstsq函数在numpy中完成的. (无需先计算SVD分解,然后再求解.)
>>> 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.])
请注意,b的长度必须与A的行数相同,因此您的示例是错误的.只是为了确保我正确地解释了IDL语义,这是svsol reference manual中的示例:
>>> 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]
标签:svd,linear-algebra,idl,idl-programming-language,python 来源: https://codeday.me/bug/20191031/1978870.html