Digamos que temos X de forma (2, 5)
e y de forma (2,)
Isso funciona: np.linalg.lstsq(X, y)
Esperaríamos que isso funcionasse apenas se X tivesse a forma (N, 5) onde N> = 5 Mas por que e como?
Recebemos de volta 5 pesos conforme o esperado, mas como esse problema é resolvido?
Não é como se tivéssemos 2 equações e 5 incógnitas?
Como numpy poderia resolver isso?
Ele deve fazer algo como interpolação para criar equações mais artificiais?
least-squares
linear-algebra
numpy
George Pligoropoulos
fonte
fonte
Respostas:
Meu entendimento é que o numpy.linalg.lstsq depende da rotina LAPACK dgelsd .
O problema é resolver:
Obviamente, isso não tem uma solução exclusiva para uma matriz A cuja classificação é menor que o comprimento do vetorb . No caso de um sistema indeterminado, z tal que:
dgelsd
fornece uma soluçãoExemplo, se o sistema forx + 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çãovocêΣ 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 matrizUMA 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:
O pseudo-inverso deUMA é dado por:
Considere a soluçãox = A†b . Então:
Existem basicamente dois casos aqui:
Equivalência de pseudo-inverso
Para um sistema indeterminado, você pode mostrar que o pseudo-inverso fornece a solução de norma mínima.
fonte
lm
usa a fatoração QR por padrão, mas você pode especificar alternativas.