谁能详细解释 linalg.lstsq 的返回吗?

use*_*628 1 python numpy least-squares

虽然提供了linalg.lstsq 文档。我还是觉得不太明白,因为不太详细。

x : {(N,), (N,K)} ndarray

最小二乘解。如果 b 是二维的,则解位于 x 的 K 列中。

残差:{(1,), (K,), (0,)} ndarray

残差总和;b - a*x 中每列的欧几里德 2-范数平方。如果 a 的秩 < N 或 M <= N,则这是一个空数组。如果 b 是一维,则这是一个 (1,) 形状的数组。否则形状为 (K,)。

排名:整数

矩阵 a 的秩。

s : (min(M, N),) ndarray

a 的奇异值。

我尝试观察输出。但我只知道排名是2。对于其余的,我不明白为什么会这样。

x = np.array([0, 1, 2, 3])
y = np.array([-1, 0.2, 0.9, 2.1])
A = np.vstack([x, np.ones(len(x))]).T
print(A)
print('-------------------------')
print(np.linalg.lstsq(A, y, rcond=None))
Run Code Online (Sandbox Code Playgroud)

给予

[[0. 1.]
 [1. 1.]
 [2. 1.]
 [3. 1.]]
-------------------------
(array([ 1.  , -0.95]), array([0.05]), 2, array([4.10003045, 1.09075677]))
Run Code Online (Sandbox Code Playgroud)

我不明白元组“(N, ), (N, K), (1,), (K,), (0,), (M, N)”在文档中代表什么。

例如,它与 {(N,), (N, K)} 有什么关系np.linalg.lstsq(A, y, rcond=None)[0]array([ 1. , -0.95])

小智 5

这些元组是输入和输出的可能形状。在你的例子中,A.shape = (4, 2)y.shape = (4,). 查看文档,M = 4N = 2,我们正在处理没有 的情况K。所以输出的形状应该是x.shape = (N,) = (2,), residuals.shape = (1,), s.shape = (min(M, N),) = (2,)

让我们一次看一个输出

>>> x, residuals, rank, s = np.linalg.lstsq(A, y, rcond=None)
Run Code Online (Sandbox Code Playgroud)

x是 的最小二乘解A @ x = y,因此它最小化np.linalg.norm(A @ x - y)**2

>>> A.T @ (A @ x - y)
array([1.72084569e-15, 2.16493490e-15])
Run Code Online (Sandbox Code Playgroud)

其他输出可以告诉您该解决方案有多好以及它对数值错误的影响有多大。

residualsA @ x是和之间不匹配的平方范数y

>>> np.linalg.norm(A @ x - y)**2
0.04999999999999995
>>> residuals[0]
0.04999999999999971
Run Code Online (Sandbox Code Playgroud)

rank是 的等级A

np.linalg.matrix_rank(A)
2
>>> rank
2
Run Code Online (Sandbox Code Playgroud)

s包含奇异值A

>>> np.linalg.svd(A, compute_uv=False)
array([4.10003045, 1.09075677])
>>> s
array([4.10003045, 1.09075677])
Run Code Online (Sandbox Code Playgroud)

您熟悉数学概念吗?