Насколько я понимаю, numpy.linalg.lstsq использует подпрограмму LAPACK dgelsd .
Задача состоит в том, чтобы решить:
minimize(overx)∥Ax−b∥2
Конечно, это не имеет единственного решения для матрицы A, ранг которой меньше длины вектора . В случае неопределенной системы предоставляет решение такое, что:bdgelsd
z
- Az=b
- ∥z∥2≤∥x∥2 для всех которые удовлетворяют . (то есть является минимальным решением для неопределенной системы.xAx=bz
Например, если система имеет , numpy.linalg.lstsq вернет .x+y=1x=.5,y=.5
Как работает dgelsd?
Процедура dgelsd
вычисляет разложение по сингулярным числам (SVD) в A.
Я просто набросаю идею использования SVD для решения линейной системы. Разложение по сингулярным значениям - это факторизация где и - ортогональные матрицы, а - диагональная матрица, в которой диагональные элементы известны как сингулярные значения.UΣV′=AUVΣ
Эффективным рангом матрицы будет число сингулярных значений, которые фактически не равны нулю (т. Е. Достаточно отличаются от нуля относительно точности машины и т. Д.). Пусть - диагональная матрица ненулевых сингулярных значений. SVD, таким образом:AS
A=U[S000]V′
Псевдообратная из определяется по формуле:A
A†=V[S−1000]U′
Рассмотрим решение . Потом:x=A†b
Ax−b=U[S000]V′V[S−1000]U′b−b=U[I000]U′b−b
Здесь в основном два случая:
- Число ненулевых сингулярных значений (т. Е. Размер матрицы ) меньше длины . Решение здесь не будет точным; мы решим линейную систему в смысле наименьших квадратов.Ib
- Ax−b=0
Эта последняя часть немного хитрая ... нужно отслеживать размеры матрицы и использовать как ортогональную матрицу.U
Эквивалентность псевдообратного
Когда имеет линейно независимые строки (например, у нас толстая матрица), тогда:
AA†=A′(AA′)−1
Для неопределенной системы вы можете показать, что псевдообратное решение дает минимальное решение для нормы.
Когда имеет линейно независимые столбцы (например, у нас есть тощая матрица), тогда:
AA†=(A′A)−1A′