Ma compréhension est que numpy.linalg.lstsq s'appuie sur la routine LAPACK dgelsd .
Le problème est de résoudre:
minimize(overx)∥Ax−b∥2
Bien sûr, cela n'a pas de solution unique pour une matrice A dont le rang est inférieur à la longueur du vecteur . Dans le cas d'un système indéterminé, fournit une solution telle que:bdgelsd
z
- Az=b
- ∥z∥2≤∥x∥2 pour tous les qui satisfont . (c'est-à-dire que est la solution de norme minimale au système indéterminé.xAx=bz
Par exemple, si le système est , numpy.linalg.lstsq retournera .x+y=1x=.5,y=.5
Comment fonctionne dgelsd?
La routine dgelsd
calcule la décomposition en valeurs singulières (SVD) de A.
Je vais simplement esquisser l'idée derrière l'utilisation d'un SVD pour résoudre un système linéaire. La décomposition en valeurs singulières est une factorisation où et sont des matrices orthogonales et est une matrice diagonale où les entrées diagonales sont appelées valeurs singulières.UΣV′=AUVΣ
Le rang effectif de la matrice sera le nombre de valeurs singulières qui sont effectivement non nulles (c'est-à-dire suffisamment différentes de zéro par rapport à la précision de la machine etc ...). Soit une matrice diagonale des valeurs singulières non nulles. Le SVD est donc:AS
A=U[S000]V′
Le pseudo-inverse de est donné par:A
A†=V[S−1000]U′
Considérez la solution . Alors:x=A†b
Ax−b=U[S000]V′V[S−1000]U′b−b=U[I000]U′b−b
Il y a essentiellement deux cas ici:
- Le nombre de valeurs singulières non nulles (c'est-à-dire la taille de la matrice ) est inférieur à la longueur de . La solution ici ne sera pas exacte; nous allons résoudre le système linéaire dans le sens des moindres carrés.Ib
- Ax−b=0
Cette dernière partie est un peu délicate ... il faut garder une trace des dimensions de la matrice et utiliser que est une matrice orthogonale.U
Équivalence de pseudo-inverse
Quand a des lignes linéairement indépendantes (par exemple, nous avons une matrice grasse), alors:
AA†=A′(AA′)−1
Pour un système indéterminé, vous pouvez montrer que le pseudo-inverse vous donne la solution de norme minimale.
Lorsque a des colonnes linéairement indépendantes (par exemple, nous avons une matrice maigre), alors:
AA†=(A′A)−1A′