2012-06-18 17 views
15

Scipy y Numpy tienen entre ellos tres funciones diferentes para encontrar vectores propios de una matriz cuadrada dada, estos son:vectores propios Python: diferencias entre numpy.linalg, scipy.linalg y scipy.sparse.linalg

  1. numpy.linalg.eig(a)
  2. scipy.linalg.eig(a) y
  3. scipy.sparse.linalg.eig(A, k)

se centra específicamente en la situación que todos los argumentos opcionales i'v e interrumpió los dos últimos están a la izquierda en sus fallos y que a/A es de valor real, tengo curiosidad acerca de las diferencias entre estos tres que son ambiguos de la documentación - en especial:

  • ¿Por qué (3) tenga una nota que no puede encontrar todos eigenvectors?
  • ¿Por qué debe las otras dos calculan todas las soluciones? ¿Por qué no toman un argumento k?
  • (1) tiene una nota que dice que los valores propios se devuelven sin un orden en particular; (3) tiene un argumento opcional para controlar el orden. ¿(2) hace alguna garantía sobre esto?
  • ¿(3) supone que A es escaso? (matemáticamente hablando, en lugar de ser representado como una matriz dispersa escasa) ¿Puede ser ineficiente, o incluso dar resultados erróneos, si esta suposición no se cumple?
  • ¿Hay otros factores que deba considerar al elegir entre estos?

Respuesta

12

El comportamiento especial del tercero tiene que ver con el Lanczos algorithm, que funciona muy bien con matrices dispersas. La documentación de scipy.sparse.linalg.eig dice que usa un envoltorio para ARPACK, que a su vez usa "el Método Arnoldi reiniciado implícitamente (IRAM) o, en el caso de matrices simétricas, la variante correspondiente del algoritmo de Lanczos". (1).

Ahora, el algoritmo de Lanczos tiene la propiedad de que funciona mejor para los grandes valores propios (de hecho, se utiliza el máximo valor propio):

En la práctica, este sencillo algoritmo no funciona muy bien para la computación muchos de los vectores propios porque cualquier error de redondeo tenderá a introducir componentes leves de los autovectores más significativos en el cálculo, lo que degrada la precisión del cálculo . (2)

Así, mientras que el algoritmo de Lanczos es sólo una aproximación, supongo que los otros dos métodos utilizan algos para encontrar los valores propios exactas - y aparentemente todos ellos, lo que probablemente depende de los algoritmos utilizados, también .

6

Aquí es una respuesta de la parte específica no rutinaria de su pregunta:

En principio, los NumPy y SciPy linalg() rutinas deben ser el mismo. Ambos usan rutinas LAPACK y BLAS internamente. La implementación en `scipy.sparse`` usa un algoritmo específico que funciona bien para matrices dispersas (es decir, matrices con entradas casi nulas).No use esto si su matriz es densa.

Tenga en cuenta que técnicamente, eig() en SciPy/NumPy son implementaciones diferentes debido al hecho de que ambos paquetes se pueden construir con diferentes implementaciones de Lapack/BLAS. Las opciones comunes aquí serían estándar Lapack/BLAS disponibles de netlib, ATLAS, Intel MKL o OpenBLAS.

Cuestiones relacionadas