谁能详细解释一下return of linalg.lstsq?

Could anyone explain the return of linalg.lstsq in details?

尽管提供了 linalg.lstsq document。还是觉得不太好理解,不够详细。

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

Least-squares solution. If b is two-dimensional, the solutions are in the K columns of x.

residuals : {(1,), (K,), (0,)} ndarray

Sums of residuals; squared Euclidean 2-norm for each column in b - a*x. If the rank of a is < N or M <= N, this is an empty array. If b is 1-dimensional, this is a (1,) shape array. Otherwise the shape is (K,).

rank : int

Rank of matrix a.

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

Singular values of a.

我试着观察输出。但是我只知道rank是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))

给予

[[0. 1.]
 [1. 1.]
 [2. 1.]
 [3. 1.]]
-------------------------
(array([ 1.  , -0.95]), array([0.05]), 2, array([4.10003045, 1.09075677]))

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

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

这些元组是输入和输出的可能形状。 在您的示例中,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)

xA @ x = y 的最小二乘解,所以它最小化 np.linalg.norm(A @ x - y)**2:

>>> A.T @ (A @ x - y)
array([1.72084569e-15, 2.16493490e-15])

其他输出告诉您这个解决方案有多好以及它对数值错误的敏感程度。

residualsA @ xy 之间不匹配的平方范数:

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

rankA的排名:

np.linalg.matrix_rank(A)
2
>>> rank
2

s 包含 A

的奇异值
>>> np.linalg.svd(A, compute_uv=False)
array([4.10003045, 1.09075677])
>>> s
array([4.10003045, 1.09075677])

你熟悉数学概念吗?