numpy线性代数基础帮助

2 投票
3 回答
1955 浏览
提问于 2025-04-15 11:38

我需要做的是这个-

我有一个方程-

Ax = y

这里的A是一个有理数的矩阵,大小是m乘n(m小于等于n),而x和y是合适大小的向量。我知道A和y,但我不知道x等于多少。我也知道没有一个x能让Ax完全等于y。我想找到一个向量x',使得Ax'尽可能接近y。也就是说,(Ax' - y)要尽量接近(0,0,0,...0)。

我知道我需要使用lstsq函数:http://www.scipy.org/doc/numpy_api_docs/numpy.linalg.linalg.html#lstsq

或者svd函数:http://www.scipy.org/doc/numpy_api_docs/numpy.linalg.linalg.html#svd

我完全看不懂这些文档。能不能有人教我怎么用这些函数来解决我的问题。

非常感谢!!!

3 个回答

0

矩阵A的奇异值分解(SVD)会给你两个正交矩阵U和V,以及一个对角矩阵Σ,满足以下关系:

A = U Σ V T

其中,

U UT = I ;

V VT = I

因此,如果:

x A = y

那么:

x U Σ V T = y

x U Σ V T V = y V

x U Σ = y V

U T x Σ = y V

x Σ = U y V

x = Σ -1 U T y V

x = V T Σ -1 U T y

所以,给定矩阵A的奇异值分解,你可以得到x


虽然对于一般的矩阵来说A B 不等于 B A,但对于向量x来说,x U 等于 U T x 是成立的。

举个例子,考虑x = ( x, y ),U = ( a, b ; c, d ):

x U = ( x, y ) ( a, b ; c, d )

= ( xa+yc, xb+yd)

= ( ax+cy, bx+dy)

= ( a, c; b, d ) ( x; y )

= U T x

当你观察x U中的值时,它们是xU的列的点积,而UTx中的值是xUT的行的点积,这种行和列的关系在转置中是很明显的。

2

这个更新后的文档可能会对你更有帮助……看起来你想要的是

numpy.linalg.lstsq(A, y)
0

SVD是用在行数(m)少于列数(n)的情况,因为在这种情况下,你的自由度不够。

关于lstsq的文档看起来不是很有用。我认为这是最小二乘法拟合,适用于行数(m)多于列数(n)的情况。

如果行数(m)少于列数(n),你就需要用SVD

撰写回答