Я розумію, що 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) А.
Я просто змалюю ідею використання 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′