La mia comprensione è che numpy.linalg.lstsq si basa sulla routine dAPP di LAPACK .
Il problema è risolvere:
minimizzare ( oltrex )∥ A x - b ∥2
Naturalmente, questo non ha una soluzione unica per una matrice A il cui rango è inferiore alla lunghezza del vettore . Nel caso di un sistema indeterminato, fornisce una soluzione tale che:Bdgelsd
z
- A z = b
- ∥ z ∥2≤ ∥ x ∥2 per tutti che soddisfano . (cioè è la soluzione di norma minima al sistema indeterminato.XA x = bz
Esempio, se il sistema è , numpy.linalg.lstsq restituirà .x + y= 1x = .5 , y= .5
Come funziona dgelsd?
La routine dgelsd
calcola la decomposizione del valore singolare (SVD) di A.
Mi limiterò a delineare l'idea alla base dell'utilizzo di un SVD per risolvere un sistema lineare. La decomposizione del valore singolare è una fattorizzazione dove e sono matrici ortogonali e è una matrice diagonale in cui le voci diagonali sono note come valori singolari.UΣV′=AUVΣ
Il grado effettivo della matrice sarà il numero di valori singolari che sono effettivamente diversi da zero (cioè sufficientemente diversi da zero rispetto alla precisione della macchina, ecc ...). Sia una matrice diagonale di valori singolari diversi da zero. Lo SVD è quindi:AS
A=U[S000]V′
Lo pseudo-inverso di è dato da:A
A†=V[S−1000]U′
Considera la soluzione . Poi:x=A†b
Ax−b=U[S000]V′V[S−1000]U′b−b=U[I000]U′b−b
Fondamentalmente ci sono due casi qui:
- Il numero di valori singolari diversi da zero (ovvero la dimensione della matrice ) è inferiore alla lunghezza di . La soluzione qui non sarà esatta; risolveremo il sistema lineare nel senso dei minimi quadrati.Ib
- Ax−b=0
Quest'ultima parte è un po 'complicata ... è necessario tenere traccia delle dimensioni della matrice e utilizzare che è una matrice ortogonale.U
Equivalenza di pseudo-inverso
Quando ha righe linearmente indipendenti (ad es. Abbiamo una matrice grassa), allora:
AA†=A′(AA′)−1
Per un sistema indeterminato, puoi mostrare che lo pseudo-inverso ti offre la soluzione di norma minima.
Quando ha colonne linearmente indipendenti (ad es. Abbiamo una matrice scarna), quindi:
AA†=(A′A)−1A′