首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python中求解奇异值分解(SVD)

在Python中求解奇异值分解(SVD)
EN

Stack Overflow用户
提问于 2012-09-25 17:28:19
回答 1查看 9.6K关注 0票数 3

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

代码语言:javascript
复制
from scipy.linalg import svd
A = [[1,2,3],[4,5,6]]
b = [4,4,5]

u,w,v = svd(A)

这段代码运行得很好,并且可以很好地从IDL翻译过来。下一步是IDL(!)

代码语言:javascript
复制
x = svsol(u,w,v,b)

python和IDL中的u几乎相同(对于其他矩阵也是如此)。唯一的区别是维数,IDL的矩阵更大,但有很多零。从这个意义上说,Python的矩阵看起来更加压缩了。

有没有人知道类似的Python。

如果任何人需要它,这里是svsol的手册。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-10-05 05:21:46

在IDL语言中使用SVDCSVSOL,你可以通过奇异值分解来解决线性最小二乘问题。这是由numpy.linalg.lstsq函数在numpy中完成的。(不需要先计算SVD分解,然后再反向求解。)

代码语言:javascript
复制
>>> 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中的示例

代码语言:javascript
复制
>>> 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]
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12580019

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档