squares nonlinear leastsq least fit python numpy scipy least-squares

python - nonlinear - ¿Cuál es la diferencia entre numpy.linalg.lstsq y scipy.linalg.lstsq?



nonlinear least squares python (2)

lstsq intenta resolver Ax=b minimizando |b - Ax| . Tanto scipy como numpy proporcionan una función linalg.lstsq con una interfaz muy similar. La documentación no menciona qué tipo de algoritmo se usa, ni para scipy.linalg.lstsq ni para numpy.linalg.lstsq , pero parece que hace casi lo mismo.

La implementación parece ser diferente para scipy.linalg.lstsq y numpy.linalg.lstsq . Ambos parecen usar LAPACK, ambos algoritmos parecen usar un SVD.

¿Dónde está la diferencia? ¿Cuál debo usar?

Nota: no confunda linalg.lstsq con scipy.optimize.leastsq que puede resolver también problemas de optimización no lineales.


Numpy 1.13 - Junio ​​2017

A partir de Numpy 1.13 y Scipy 0.19, https://docs.scipy.org/doc/scipy/reference/generated/scipy.linalg.lstsq.html y numpy.linalg.lstsq() llaman por defecto el mismo código LAPACK DSGELD (consulte la documentación de LAPACK ).

Sin embargo, una diferencia importante actual entre las dos funciones está en el parámetro rcond LAPACK predeterminado adoptado (llamado rcond por Numpy y cond por Scipy), que define el umbral para valores singulares.

Scipy usa un umbral predeterminado bueno y robusto RCOND=eps*max(A.shape)*S[0] , donde S[0] es el mayor valor singular de A , mientras que Numpy usa un umbral predeterminado RCOND=-1 , que corresponde para configurar en LAPACK el umbral igual a la precisión de la máquina, independientemente de los valores de A

El enfoque predeterminado de Numpy es básicamente inútil en aplicaciones realistas y generalmente resultará en una solución muy degenerada cuando A es casi deficiente en rango, desperdiciando la precisión de la SVD de descomposición de valor singular utilizada por DSGELD. Esto implica que en Numpy siempre se debe utilizar el parámetro opcional rcond .

Actualización: Numpy 1.14 - Enero 2018

rcond valor predeterminado incorrecto de rcond (ver la sección anterior) en numpy.linalg.lstsq() y la función ahora genera un indicador de futuro en Numpy 1.14 (ver Cambios futuros ).

El comportamiento futuro será idéntico tanto en https://docs.scipy.org/doc/scipy/reference/generated/scipy.linalg.lstsq.html como en numpy.linalg.lstsq() . En otras palabras, Scipy y Numpy no solo usarán el mismo código LAPACK, sino que también usarán los mismos valores predeterminados.

Para comenzar a usar el valor predeterminado correcto (es decir, futuro) en Numpy 1.14, se debe llamar a numpy.linalg.lstsq() con un rcond=None explícito rcond=None .


Si leo bien el código fuente (Numpy 1.8.2, Scipy 0.14.1), numpy.linalg.lstsq() usa la rutina LAPACK xGELSD y scipy.linalg.lstsq() usa xGELSS .

El manual LAPACK Sec. 2.4 estados

La subrutina xGELSD es significativamente más rápida que su contraparte anterior xGELSS, especialmente para problemas grandes, pero puede requerir algo más de espacio de trabajo según las dimensiones de la matriz.

Eso significa que Numpy es más rápido pero usa más memoria.

Actualización de agosto de 2017:

Scipy ahora utiliza xGELSD de forma predeterminada https://docs.scipy.org/doc/scipy/reference/generated/scipy.linalg.lstsq.html