Mi entendimiento es que numpy.lingalg.lstsq se basa en la LAPACK rutina dgelsd.
El problema es resolver:
$$ \text{minimize} (\text{over} \; \mathbf{x}) \quad \| A\mathbf{x} - \mathbf{b} \|_2$$
Of course, this does not have a unique solution for a matrix A whose rank is less than length of vector $\mathbf{b}$. In the case of an undetermined system, dgelsd
provides a solution $\mathbf{z}$ such that:
- $\mathbf{z} = \mathbf{b}$
- $\| \mathbf{z} \|_2 \leq \|\mathbf{x} \|_2$ todos los $\mathbf{x}$ que satisfacer $A\mathbf{x} = \mathbf{b}$. (es decir, $\mathbf{z}$ es el mínimo de la norma de la solución a la indeterminación del sistema.
Ejemplo, si el sistema es $x + y = 1$, numpy.linalg.lstsq volvería $x = .5, y = .5$.
¿Cómo dgelsd trabajo?
La rutina dgelsd
calcula la descomposición de valor singular (SVD) de A.
Voy a esbozar la idea detrás del uso de un SVD para resolver un sistema lineal. La descomposición de valor singular es una factorización de la $U \Sigma V' = A$ donde $U$ $V$ son matrices ortogonales y $\Sigma$ es una matriz diagonal donde la diagonal entradas son conocidos como valores singulares.
La efectiva rango de la matriz $A$ será el número de valores singulares que son efectivamente distinto de cero (es decir, lo suficientemente diferente de cero relativo a la precisión de la máquina, etc...). Deje $S$ ser una matriz diagonal de la no-cero valores singulares. El SVD es así:
$$ A = U \begin{bmatrix} S & 0 \\ 0 & 0 \end{bmatrix} V' $$
The pseudo-inverse of $Un$ is given by:
$$ A^\dagger = V \begin{bmatrix} S^{-1} & 0 \\ 0 & 0 \end{bmatrix} U' $$
Consider the solution $\mathbf{x} = A^\daga \mathbf{b}$. Entonces:
\begin{align*}
A\mathbf{x} - \mathbf{b} &= U \begin{bmatrix} S & 0 \\ 0 & 0 \end{bmatrix} V' V \begin{bmatrix} S^{-1} & 0 \\ 0 & 0 \end{bmatrix} U' \mathbf{b} - \mathbf{b} \\ &= U \begin{bmatrix} I & 0 \\ 0 & 0 \end{bmatrix} U' \mathbf{b} - \mathbf{b}\\
\end{align*}
Hay básicamente dos casos aquí:
- El número de valores singulares (por ejemplo, tamaño de la matriz $I$) es menor que la longitud de $\mathbf{b}$. Aquí la solución no ser exactos, vamos a resolver el sistema lineal en un sentido de los mínimos cuadrados.
- $A\mathbf{x} - \mathbf{b} = \mathbf{0}$
Esta última parte es un poco complicada... es necesario hacer un seguimiento de la matriz de las dimensiones y el uso que $U$ es una matriz ortogonal.
La equivalencia de la pseudo-inversa
Al $A$ ha filas linealmente independientes (por ejemplo. tenemos una grasa de la matriz), entonces:
$$A^\dagger = A'\left(AA' \right)^{-1}$$
For an undetermined system, you can show that the pseudo-inverse gives you the minimum norm solution.
When $Un$ ha columnas linealmente independientes, (ej. tenemos un flaco de la matriz), entonces:
$$A^\dagger = \left(A'A \right)^{-1}A'$$