Comment NumPy résout-il les moindres carrés pour les systèmes sous-déterminés?

14

Disons que nous avons X de forme (2, 5)
et y de forme (2,)

Cela marche: np.linalg.lstsq(X, y)

Nous nous attendrions à ce que cela ne fonctionne que si X était de forme (N, 5) où N> = 5 Mais pourquoi et comment?

Nous récupérons 5 poids comme prévu, mais comment ce problème est-il résolu?

N'est-ce pas comme si nous avions 2 équations et 5 inconnues?
Comment numpy pourrait-il résoudre ce problème?
Il doit faire quelque chose comme l'interpolation pour créer des équations plus artificielles? ..

George Pligoropoulos
la source
3
Pourquoi ça ne marcherait pas? Un système indéterminé a de nombreuses solutions.
Matthew Gunn
Avez-vous un lien avec la théorie pertinente? ..
George Pligoropoulos

Réponses:

19

Ma compréhension est que numpy.linalg.lstsq s'appuie sur la routine LAPACK dgelsd .

Le problème est de résoudre:

minimize(overx)Axb2

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:bdgelsdz

  • Az=b
  • z2x2 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 dgelsdcalcule 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[S1000]U

Considérez la solution . Alors:x=Ab

Axb=U[S000]VV[S1000]Ubb=U[I000]Ubb

Il y a essentiellement deux cas ici:

  1. 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
  2. Axb=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: A

A=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: A

A=(AA)1A

Matthew Gunn
la source
dgelsd utilise SVD mais R lm utilise QR?
Haitao Du
@ hxd1011R lmutilise la factorisation QR par défaut mais vous pouvez spécifier des alternatives.
Sycorax dit Réintégrer Monica le