2012-06-18 10 views
15

SciPy e Numpy avere tra loro tre funzioni differenti per trovare autovettori per una data matrice quadrata, questi sono:autovettori Python: differenze tra numpy.linalg, scipy.linalg e scipy.sparse.linalg

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

concentrandosi in particolare sulla situazione che tutti gli argomenti opzionali I'v e ha lasciato fuori l'ultimo due si lasciano alle loro impostazioni predefinite e che a/A è a valori reali, sono curioso circa le differenze tra questi tre che sono ambigui dalla documentazione - in particolare:

  • Perché (3) nota che non è possibile trovare gli autovettori tutti gli autovettori?
  • Perché deve gli altri due calcolano tutte le soluzioni - perché non prendono un argomento k?
  • (1) ha una nota che dice che gli autovalori sono restituiti in nessun ordine particolare; (3) ha un argomento facoltativo per controllare l'ordine. (2) fornisce garanzie in merito?
  • Fa (3) supporre che A è scarso? (matematicamente parlando, piuttosto che essere rappresentato come una matrice scipy sparsa) Può essere inefficiente, o anche dare risultati errati, se questa ipotesi non regge?
  • Ci sono altri fattori che dovrei considerare quando scelgo tra questi?

risposta

12

Il comportamento speciale del terzo ha a che fare con lo Lanczos algorithm, che funziona molto bene con le matrici sparse. La documentazione di scipy.sparse.linalg.eig dice che utilizza un involucro per ARPACK, che a sua volta utilizza "l'Implicitamente Restarted Arnoldi Method (IRAM) o, nel caso di matrici simmetriche, la corrispondente variante dell'algoritmo Lanczos." (1).

Ora, l'algoritmo di Lanczos ha la proprietà che funziona meglio per i grandi autovalori (in realtà, esso usa la massima autovalore):

In pratica, questo semplice algoritmo non funziona molto bene per informatica moltissimi degli autovettori perché qualsiasi errore di arrotondamento tenderà ad introdurre lievi componenti dei più significativi autovettori indietro nel calcolo, degradando la precisione del calcolo . (2)

Così, mentre l'algoritmo di Lanczos è solo un'approssimazione, credo che gli altri due metodi utilizzano algos per trovare le esatte autovalori - e apparentemente tutti loro, che probabilmente dipende gli algoritmi utilizzati, anche .

6

Ecco una risposta la parte specifica non di routine della tua domanda:

In linea di principio, le routine NumPy e SciPy linalg() dovrebbero essere gli stessi. Entrambi usano internamente le routine LAPACK e BLAS. L'implementazione in `'scipy.sparse`` utilizza un algoritmo specifico che funziona bene per matrici sparse (ad esempio, matrici con voci per lo più pari a zero).Non usare questo se la tua matrice è densa.

Nota che, tecnicamente, lo eig() in SciPy/NumPy può essere implementato in modo diverso a causa del fatto che entrambi i pacchetti possono essere compilati con diverse implementazioni di Lapack/BLAS. Le scelte comuni qui sarebbero Lapack/BLAS standard disponibili da netlib, ATLAS, Intel MKL o OpenBLAS.