Meu entendimento é que o numpy.linalg.lstsq depende da rotina LAPACK dgelsd .
O problema é resolver:
minimize(overx)∥Ax−b∥2
Obviamente, isso não tem uma solução exclusiva para uma matriz A cuja classificação é menor que o comprimento do vetor b . No caso de um sistema indeterminado, dgelsd
fornece uma solução z tal que:
- Az=b
- ∥z∥2≤∥x∥2 para todos osx que satisfazemAx=b . (iez é a solução de norma mínima para o sistema indeterminado.
Exemplo, se o sistema for x + y= 1 , numpy.linalg.lstsq retornaria x = 0,5 , y= 0,5 .
Como o dgelsd funciona?
A rotina dgelsd
calcula a decomposição de valor singular (SVD) de A.
Vou apenas esboçar a idéia por trás do uso de um SVD para resolver um sistema linear. A decomposição do valor singular é uma fatoração vocêΣ V′= A onde você e V são matrizes ortogonais e Σ é uma matriz diagonal em que as entradas diagonais são conhecidas como valores singulares.
A classificação efetiva da matriz UMA será o número de valores singulares efetivamente diferentes de zero (ou seja, suficientemente diferentes de zero em relação à precisão da máquina, etc ...). Seja S uma matriz diagonal dos valores singulares diferentes de zero. O SVD é assim:
A = U[ S0 00 00 0] V′
O pseudo-inverso de UMA é dado por:
UMA†= V[ S- 10 00 00 0] U′
Considere a solução x = A†b . Então:
A x - b= U[ S0 00 00 0] V′V[ S- 10 00 00 0] U′b - b= U[ Eu0 00 00 0] U′b - b
Existem basicamente dois casos aqui:
- O número de valores singulares diferentes de zero (ou seja, o tamanho da matriz Eu ) é menor que o comprimento de b . A solução aqui não será exata; resolveremos o sistema linear no sentido dos mínimos quadrados.
- A x - b = 0
você
Equivalência de pseudo-inverso
UMAUMA†= A′(AA′)−1
Para um sistema indeterminado, você pode mostrar que o pseudo-inverso fornece a solução de norma mínima.
AA†=(A′A)−1A′