Tengo entendido que numpy.linalg.lstsq se basa en la rutina LAPACK dgelsd .
El problema es resolver:
minimizar ( sobrex )∥ A x - b ∥2
Por supuesto, esto no tiene una solución única para una matriz A cuyo rango es menor que la longitud del vector si . En el caso de un sistema indeterminado, dgelsd
proporciona una solución z tal que:
- A z = b
- ∥ z ∥2≤ ∥ x ∥2 para todas lasX que satisfacenA x = b . (es decir,z es la solución de norma mínima para el sistema indeterminado.
Ejemplo, si el sistema es x + y= 1 , numpy.linalg.lstsq devolvería x = .5 , y= .5 .
¿Cómo funciona dgelsd?
La rutina dgelsd
calcula la descomposición del valor singular (SVD) de A.
Esbozaré la idea detrás de usar un SVD para resolver un sistema lineal. La descomposición del valor singular es una factorización UΣV′=A donde U y V son matrices ortogonales y Σ es una matriz diagonal donde las entradas diagonales se conocen como valores singulares.
El rango efectivo de la matriz A será el número de valores singulares que efectivamente no son cero (es decir, suficientemente diferentes de cero en relación con la precisión de la máquina, etc.). Sea S una matriz diagonal de los valores singulares distintos de cero. La SVD es así:
A=U[S000]V′
El pseudoinverso de A viene dado por:
A†=V[S−1000]U′
Considere la solución x=A†b . Luego:
Ax−b=U[S000]V′V[S−1000]U′b−b=U[I000]U′b−b
Básicamente hay dos casos aquí:
- Ib
- Ax−b=0
U
Equivalencia de pseudoinverso
AA†=A′(AA′)−1
Para un sistema indeterminado, puede demostrar que el pseudo-inverso le brinda la solución de norma mínima.
Cuando tiene columnas linealmente independientes (por ejemplo, tenemos una matriz delgada), entonces:
AA†=(A′A)−1A′