Quelle est la différence entre numpy.linalg.lstsq et scipy.linalg.lstsq?

lstsq tente de résoudre Ax=b minimisant |b - Ax|. Scipy et numpy fournissent tous deux 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 numpy.linalg.lstsq, mais il semble faire à peu près la même.

La mise en œuvre semble être différent de scipy.linalg.lstsq et numpy.linalg.lstsq. Les deux semblent utilisez LAPACK, les deux algorithmes semblent utiliser un SVD.

Où est la différence? Qui dois-je utiliser?

Remarque: ne pas confondre linalg.lstsqscipy.optimize.leastsq qui peut aussi résoudre des problèmes d'optimisation non linéaire.

22
demandé sur lumbric 2015-03-31 18:34:38

2 réponses

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()xGELSS.

manuel LAPACK sec. 2.4 membres

le sous-programme xGELSD est nettement plus rapide que son homologue plus ancien xGELSS, surtout pour les gros problèmes, mais peut nécessiter un peu plus d'espace de travail selon les dimensions de la matrice.

cela signifie que Numpy est plus rapide mais utilise plus mémoire.

Mise À Jour Août 2017:

Scipy utilise maintenant xGELSD par défaut https://docs.scipy.org/doc/scipy/reference/generated/scipy.linalg.lstsq.html

18
répondu Dietrich 2017-08-03 08:59:33

Numpy 1.13 - Juin 2017

Comme de Numpy 1.13 et Scipy de 0,19, scipy.linalg.lstsq () et numpy.linalg.lstsq () appel par défaut le même LAPACK code DSGELD (voir documentation LAPACK).

cependant, une différence importante entre les deux fonctions se trouve dans le paramètre adopté par défaut RCOND LAPACK (appelé rcond par Numpy et cond par Scipy), qui définit le seuil 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, alors que Numpy utilise un seuil par défaut RCOND=-1, ce qui correspond au réglage dans LAPACK du seuil égal à la précision de la machine, indépendamment des valeurs de A.

L'approche par défaut de Numpy est fondamentalement inutile dans les applications réalistes et aboutira généralement à une solution très dégénérée lorsque A est près de grade déficient, gaspillant la précision de la valeur singulière de décomposition SVD utilisé par DSGELD. Cela implique que dans Numpy le paramètre optionnel rcond doit être toujours utilisé.

Mise À Jour: Numpy 1.14-Janvier 2018

j'ai signalé le mauvais défaut de rcond (voir la Section ci-dessus) dans numpy.linalg.lstsq () et la fonction soulève maintenant un FutureWarning dans Numpy 1.14 (voir Changements Futurs).

L'avenir le comportement sera identique à la fois dans scipy.linalg.lstsq () et numpy.linalg.lstsq (). En d'autres termes, Scipy et Numpy n'utiliseront pas 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 () explicite rcond=None.

11
répondu divenex 2018-01-19 09:50:21