Кто-нибудь может объяснить возвращение linalg.lstsq в деталях? - PullRequest
0 голосов
/ 27 января 2020

Хотя предлагается документ linalg.lstsq . Мне все еще трудно понять, так как это не совсем подробно.

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

Решение наименьших квадратов. Если b двумерно, решения находятся в K столбцах x.

остатков: {(1,), (K,), (0,)} ndarray

Суммы остатки; квадрат евклидовой 2-нормы для каждого столбца в b - a * x. Если ранг a

rank: int

Rank матрицы 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))

Дает

[[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)}?

1 Ответ

1 голос
/ 27 января 2020

Эти кортежи являются возможными формами входов и выходов. В вашем примере 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])

Вы знакомы с математическими понятиями?

...