Nach meinem Verständnis basiert numpy.linalg.lstsq auf der LAPACK- Routine dgelsd .
Das Problem ist zu lösen:
minimize(overx)∥Ax−b∥2
Dies hat natürlich keine eindeutige Lösung für eine Matrix A, deren Rang kleiner als die Länge des Vektors b . dgelsd
Bietet im Falle eines unbestimmten Systems eine Lösung z , die Folgendes beinhaltet :
- Az=b
- ∥z∥2≤∥x∥2 für allex , dieAx=b erfüllen. (dhz ist die minimale Normlösung für das unbestimmte System.
Beispiel, wenn System ist x+y=1 , gibt numpy.linalg.lstsqx=.5,y=.5 .
Wie funktioniert dgelsd?
Die Routine dgelsd
berechnet die Singularwertzerlegung (SVD) von A.
Ich skizziere nur die Idee hinter der Verwendung einer SVD zur Lösung eines linearen Systems. Die Singulärwertzerlegung ist eine Faktorisierung UΣV′=A wobeiU undV orthogonale Matrizen sind undΣ eine Diagonalmatrix ist, bei der die Diagonaleinträge als Singularwerte bezeichnet werden.
Der effektive Rang der Matrix A ist die Anzahl der singulären Werte, die effektiv nicht Null sind (dh sich ausreichend von Null in Bezug auf die Maschinengenauigkeit usw. unterscheiden). Sei S eine Diagonalmatrix der von Null verschiedenen Singularwerte. Die SVD ist also:
A=U[S000]V′
Die Pseudoinverse von A ist gegeben durch:
A†=V[S−1000]U′
Betrachten Sie die Lösung x=A†b . Dann:
Ax−b=U[S000]V′V[S−1000]U′b−b=U[I000]U′b−b
Grundsätzlich gibt es hier zwei Fälle:
- Die Anzahl der singulären Werte ungleich Null (dh die Größe der Matrix I ) ist kleiner als die Länge von b . Die Lösung hier wird nicht genau sein; Wir werden das lineare System im Sinne der kleinsten Quadrate lösen.
- Ax−b=0
Dieser letzte Teil ist etwas knifflig. Sie müssen die Matrixdimensionen verfolgen und verwenden, dass U eine orthogonale Matrix ist.
Äquivalenz von Pseudo-Inverse
Wenn A linear unabhängige Reihen hat (z. B. wir haben eine Fettmatrix), dann gilt:
A†=A′(AA′)−1
Für ein unbestimmtes System können Sie zeigen, dass das Pseudo-Inverse die minimale Normlösung ergibt.
Wenn A linear unabhängige Spalten hat (z. B. haben wir eine dünne Matrix), dann gilt:
A†=(A′A)−1A′