numpy线性代数基础帮助
我需要做的是这个-
我有一个方程-
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 个回答
矩阵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中的值时,它们是x和U的列的点积,而UTx中的值是x和UT的行的点积,这种行和列的关系在转置中是很明显的。
这个更新后的文档可能会对你更有帮助……看起来你想要的是
numpy.linalg.lstsq(A, y)
SVD是用在行数(m)少于列数(n)的情况,因为在这种情况下,你的自由度不够。
关于lstsq的文档看起来不是很有用。我认为这是最小二乘法拟合,适用于行数(m)多于列数(n)的情况。
如果行数(m)少于列数(n),你就需要用SVD。