虽然提供了linalg.lstsq文档。我仍然觉得很难理解,因为它不是很详细。
x : {(N,(, (N, K(} ndarray
最小二乘解。如果 b 是二维的,则解在 x 的 K 列。
残差 : {(1,(, (K,(, (0,(} ndarray
残差总和;b 中每列的欧几里得 2 范数平方 - a*x。如果 a 的秩是
例如,
np.linalg.lstsq(A, y, rcond=None)[0]
array([ 1. , -0.95])
它与{(N,(,(N,K(}有何关系?
这些元组是输入和输出的可能形状。 在您的示例中,A.shape = (4, 2)
和y.shape = (4,)
。 查看文档,M = 4
,N = 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)
x
是A @ x = y
的最小二乘解,所以它最小化np.linalg.norm(A @ x - y)**2
:
>>> A.T @ (A @ x - y)
array([1.72084569e-15, 2.16493490e-15])
其他输出可以告诉您此解决方案有多好,以及它对数值误差的敏感性。
residuals
是A @ x
和y
之间不匹配的平方范数:
>>> np.linalg.norm(A @ x - y)**2
0.04999999999999995
>>> residuals[0]
0.04999999999999971
rank
是A
的等级:
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])
你熟悉数学概念吗?