lstsq
essaie de résoudre Ax=b
minimiser |b - Ax|
. Scipy et numpy fournissent un linalg.lstsq
fonction avec une interface très similaire. La documentation ne mentionne pas quel type d'algorithme est utilisé, ni pour scipy.linalg.lstsq ni pour numpy.linalg.lstsq , mais il semble faire à peu près la même chose .
L'implémentation semble être différente pour scipy.linalg.lstsq et numpy.linalg.lstsq . Les deux semblent utiliser LAPACK, les deux algorithmes semblent utiliser un SVD.
Quelle est la différence? Lequel devrais-je utiliser?
Remarque: ne confondez pas linalg.lstsq
avec scipy.optimize.leastsq
qui peut également résoudre des problèmes d'optimisation non linéaire.
Si je lis le code source à droite (Numpy 1.8.2, Scipy 0.14.1), numpy.linalg.lstsq()
utilise la routine LAPACK xGELSD
et scipy.linalg.lstsq()
utilise xGELSS
.
Les états Manuel LAPACK Sec. 2.4
Le sous-programme xGELSD est nettement plus rapide que son homologue plus ancien xGELSS, en particulier pour les gros problèmes, mais peut nécessiter un peu plus d'espace de travail en fonction des dimensions de la matrice.
Cela signifie que Numpy est plus rapide mais utilise plus de mémoire.
Mise à jour d'août 2017:
Scipy utilise désormais xGELSD par défaut https://docs.scipy.org/doc/scipy/reference/generated/scipy.linalg.lstsq.html
Depuis Numpy 1.13 et Scipy 0.19, les deux scipy.linalg.lstsq () et numpy.linalg. lstsq () appelle par défaut le même code LAPACK DSGELD (voir documentation LAPACK ).
Cependant, une différence importante actuelle entre les deux fonctions réside dans le paramètre RCOND LAPACK par défaut adopté (appelé rcond
par Numpy et cond
par Scipy), qui définit le seuil pour les valeurs singulières.
Scipy utilise un seuil par défaut bon et robuste RCOND=eps*max(A.shape)*S[0]
, où S[0]
Est la plus grande valeur singulière de A
, tandis que Numpy utilise un seuil par défaut RCOND=-1
, Qui correspond à la définition dans LAPACK du seuil égal à la précision de la machine, quelles que soient les valeurs de A
.
L'approche par défaut de Numpy est fondamentalement inutile dans les applications réalistes et se traduira généralement par une solution très dégénérée lorsque A
est presque déficient en rang, gaspillant la précision de la décomposition en valeurs singulières SVD utilisée par DSGELD. Cela implique que dans Numpy, le paramètre optionnel rcond
doit être toujours utilisé.
J'ai signalé la valeur par défaut incorrecte de rcond
(voir la section ci-dessus) dans numpy.linalg.lstsq () et la fonction lève maintenant un FutureWarning
dans Numpy 1.14 (voir - Futurs changements ).
Le comportement futur sera identique à la fois dans scipy.linalg.lstsq () et dans numpy.linalg.lstsq () . En d'autres termes, Scipy et Numpy utiliseront non seulement le même code LAPACK, mais utiliseront également les mêmes valeurs par défaut.
Pour commencer à utiliser la valeur par défaut appropriée (c'est-à-dire future) dans Numpy 1.14, il faut appeler numpy.linalg.lstsq () avec un rcond=None
Explicite.