Qual è il modo più veloce per calcolare il più grande autovalore di una matrice generale?


27

EDIT: sto testando se gli autovalori hanno una grandezza di uno o più.

Devo trovare il più grande autovalore assoluto di una matrice sparsa, non simmetrica.

Ho usato la eigen()funzione di R , che utilizza l'algo QR di EISPACK o LAPACK per trovare tutti gli autovalori e quindi uso abs()per ottenere i valori assoluti. Tuttavia, devo farlo più velocemente.

Ho anche provato a utilizzare l'interfaccia ARPACK nel igraphpacchetto R. Tuttavia, ha dato un errore per una delle mie matrici.

L'implementazione finale deve essere accessibile da R.

Probabilmente ci saranno più autovalori della stessa grandezza.

Hai qualche suggerimento?

EDIT: la precisione deve essere solo a 1e-11. Una matrice "tipica" è stata finora . Sono stato in grado di fare una fattorizzazione QR su di esso. Tuttavia, è anche possibile avere quelli molto più grandi. Attualmente sto iniziando a leggere sull'algoritmo di Arnoldi. Capisco che è legato a Lanczsos.386×386

EDIT2: Se ho più matrici che sto "testando" e so che esiste una grande matrice che non varia. È possibile ignorarlo / scartarlo?


Vedi la mia risposta qui: scicomp.stackexchange.com/a/1679/979 . Questo è un argomento di ricerca attuale e gli attuali metodi possono fare meglio di Lanczos. Il problema del calcolo di valori singolari è equivalente al problema del calcolo degli autovalori.
dranxo,

2
Matrice 400x400! = Grande. Inoltre, cosa significa più grande se "Probabilmente ci saranno più autovalori della stessa grandezza"? In terra intorpidita: linalg.eig (random.normal (size = (400.400))) dura circa mezzo secondo. È troppo lento?
meawoppl,

@meawoppl sì, mezzo secondo è troppo lento. Questo perché fa parte di un altro algoritmo che esegue questo calcolo molte volte.
potenza

1
@power gotcah. Hai un'approssimazione dell'autovettore. cioè è probabilmente simile all'ultima soluzione o puoi fare un'ipotesi istruita sulla sua struttura?
meawoppl,

Risposte:


14

Dipende molto dalle dimensioni della tua matrice, nel caso di grandi dimensioni anche dal fatto che sia sparsa e dalla precisione che desideri ottenere.

Se la tua matrice è troppo grande per consentire una singola fattorizzazione e hai bisogno di un'elevata precisione, l'algoritmo di Lanczsos è probabilmente il modo più veloce. Nel caso non simmetrico, è necessario l'algoritmo di Arnoldi, che è numericamente instabile, quindi un'implementazione deve risolverlo (è piuttosto scomodo da curare).

In caso contrario, fornire informazioni più specifiche nella domanda. Quindi aggiungi un commento a questa risposta e lo aggiornerò.

Modifica: [Questo era per la vecchia versione della domanda, chiedendo il più grande autovalore.] Dato che la tua matrice è piccola e apparentemente densa, farei iterazione di Arnoldi su B = (IA) ^ {- 1}, usando un iniziale la fattorizzazione triangolare permutata di IA ha una moltiplicazione economica per B. (O calcola un inverso esplicito, ma questo costa 3 volte tanto quanto la fattorizzazione.) Vuoi verificare se B ha un autovalore negativo. Lavorando con B al posto di A, gli autovalori negativi sono molto meglio separati, quindi se ce n'è uno, dovresti convergere rapidamente.

Ma sono curioso di sapere da dove provenga il tuo problema. Le matrici non simmetriche di solito hanno autovalori complessi, quindi il "più grande" non è nemmeno ben definito. Quindi devi sapere di più sul tuo problema, che potrebbe aiutarti a suggerire come risolverlo ancora più velocemente e / o in modo più affidabile.

Edit2: è difficile ottenere con Arnoldi un particolare sottoinsieme di interesse. Per ottenere gli autovalori assolutamente più grandi in modo affidabile, eseguiresti l'iterazione del sottospazio usando la matrice originale, con una dimensione del sottospazio che corrisponda o superi il numero di autovalori previsti per essere vicino a 1 o maggiore in grandezza. Su matrici piccole, questo sarà più lento dell'algoritmo QR, ma su matrici grandi sarà molto più veloce.


Devo verificare se l'autovalore più grande è maggiore di 1. La precisione deve essere solo 1e-11. Finora una matrice "tipica" è stata di 386 x 386. Ho potuto fare una fattorizzazione QR su di essa. Tuttavia, è anche possibile avere quelli molto più grandi. Attualmente sto iniziando a leggere sull'algoritmo di Arnoldi. Capisco che è legato a Lanczsos.
potenza

Questa informazione appartiene alla tua domanda, quindi modificala e aggiungi anche altre informazioni (perché gli autovalori sono reali? O cosa significa più grande?) - vedi la modifica della mia risposta.
Arnold Neumaier,

mi dispiace di non essermi spiegato chiaramente. Inoltre non ho spiegato chiaramente che gli autovalori sono complessi. Sto testando se gli autovalori hanno una grandezza di uno o maggiore.
potenza

1
(IA)1

1
vedi modifica 2 nella mia risposta
Arnold Neumaier

7

|λn1/λn|

λn1λn


1
cosa succede se | λ (n − 1) | = | λ (n) | ?
potenza

@power, quindi la normale Iterazione di potenza non converge. Non so quanto i metodi di estrapolazione possano distinguere tra i diversi autovalori, per questo dovrai leggere l'articolo.
Pedro,

2
|λn1|=|λn|λnλn1

hai un riferimento a un documento accademico o un libro che supporta questo? Inoltre, cosa succede se \ lambda_ {n} è complesso?
potenza

5
Se esistono diversi autovalori del modulo massimo, l'iterazione della potenza converge solo in circostanze eccezionali. In genere oscilla in modo alquanto imprevedibile.
Arnold Neumaier il

5

Ci sono state alcune buone ricerche su questo recentemente. I nuovi approcci utilizzano "algoritmi randomizzati" che richiedono solo poche letture della matrice per ottenere una buona precisione sugli autovalori più grandi. Ciò è in contrasto con le iterazioni di potenza che richiedono diverse moltiplicazioni matrice-vettore per raggiungere un'elevata precisione.

Puoi leggere di più sulla nuova ricerca qui:

http://math.berkeley.edu/~strain/273.F10/martinsson.tygert.rokhlin.randomized.decomposition.pdf

http://arxiv.org/abs/0909.4061

Questo codice lo farà per te:

http://cims.nyu.edu/~tygert/software.html

https://bitbucket.org/rcompton/pca_hgdp/raw/be45a1d9a7077b60219f7017af0130c7f43d7b52/pca.m

http://code.google.com/p/redsvd/

https://cwiki.apache.org/MAHOUT/stochastic-singular-value-decomposition.html

Se la lingua che preferisci non è disponibile, puoi creare facilmente il tuo SVD randomizzato; richiede solo una moltiplicazione della matrice vettoriale seguita da una chiamata a un SVD standardizzato.


4

Qui troverai un'introduzione algoritmica all'algoritmo Jacobi-Davidson, che calcola il massimo autovalore.

In questo documento vengono esplorati gli aspetti matematici. JD consente matrici generali (reali o complesse) e può essere utilizzato per calcolare intervalli di autovalori.

Qui puoi trovare varie implementazioni di librerie JDQR e JDQZ (inclusa un'interfaccia C, a cui dovresti essere in grado di collegarti da R).


Non sono stato in grado di trovare alcuna letteratura che affermi esplicitamente che il metodo Jacobi-Davidson funziona per una matrice reale e generale.
potenza

A meno che ogni articolo non specifichi esplicitamente una restrizione e l'argomento della convergenza si basi sulla restrizione che non ha importanza.
Deathbreath

Ecco un'altra spiegazione di JD. Le matrici considerate sono completamente generali. Nessuna struttura speciale viene sfruttata e i risultati specifici delle matrici eremitiche vengono confrontati e contrastati, ad esempio, la convergenza per le matrici generali è quadratica, ma cubica per le matrici eremitiche.
Deathbreath

grazie per questo. Non trovo alcun codice C per una matrice generale, quindi dovrò scrivere il mio. I collegamenti agli algoritmi sembrano essere solo per le matrici ermetiche.
potenza

1
@power non troverai anche in letteratura un risultato che afferma che le implementazioni QR standard convergono per una matrice reale reale - questo è un problema aperto, e in effetti non molto tempo fa è stato trovato un controesempio per il codice QR in LAPACK.
Federico Poloni,

2

Nel tuo post originale, dici:

"Ho anche provato a utilizzare l'interfaccia ARPACK nel pacchetto igraph R. Tuttavia, ha dato un errore per una delle mie matrici."

Sarei interessato a saperne di più sull'errore. Se riesci a rendere questa matrice pubblicamente disponibile da qualche parte, sarei interessato a provare ARPACK su di essa.

Sulla base di quanto ho letto sopra, mi aspetterei che ARPACK farebbe un ottimo lavoro nell'estrarre gli autovalori più grandi (o alcuni dei più grandi) di una matrice sparsa. Per essere più precisi, mi aspetterei che i metodi Arnoldi funzionino bene per questo caso e che, ovviamente, è su questo che si basa ARPACK.

La lenta convergenza del metodo di alimentazione in presenza di autovalori ravvicinati nella regione di interesse è stata menzionata sopra. Arnoldi migliora questo iterando con diversi vettori anziché con il metodo del potere.


Vedrò se riuscissi a trovare il mio lavoro da allora. Ci ho lavorato un anno fa.
potenza

0

Non è il modo più veloce , ma un modo ragionevolmente veloce è semplicemente colpire ripetutamente un vettore (inizialmente casuale) con la matrice e quindi normalizzare ogni pochi passaggi. Alla fine converrà nel più grande autovettore e il guadagno in norma per un singolo passo è l'autovalore associato.

Funziona meglio quando l'autovalore maggiore è sostanzialmente maggiore di qualsiasi altro autovalore. Se un altro autovalore è vicino in grandezza al più grande, ci vorrà del tempo per convergere, e potrebbe essere difficile determinare se è convergente.


1
Grazie Dan, tuttavia: nelle mie matrici, alcuni degli altri autovalori avranno una magnitudine simile (se non la stessa) di quella più grande. Il tuo metodo è simile a Iterazione di potenza e Iterazione di quoziente di Rayleigh? Batterson e Smillie (1990) scrivono che per alcune matrici non simmetriche, l'iterazione del quoziente di Rayleigh non converge. Batterson, S., Smillie, J (1990) "Iterazione del quoziente di Rayleigh per matrici non simmetriche", Matematica del calcolo, vol 55, num 191, P 169 - 178
potenza

Se altri autovalori hanno la stessa grandezza di quello più grande ... allora questi valori non sono anche "il più grande"?
ely

@EMS: sarebbero comunque "autovalori più grandi", ma la presenza di più di uno più grande ucciderebbe comunque la convergenza.
Dan

Mi sto solo chiedendo in quale autovalore vuoi che converga. Cose come il quoziente di Rayleigh / il metodo di alimentazione si intendono quando esiste un autovalore maggiore distinto. La tua domanda ti chiede di trovare l'autovalore più grande, ma poi sembra che questo non sia in realtà ben definito per il tuo problema. Sono solo indotto in errore dal titolo del post.
ely

-1

Il pacchetto R rPACK funziona per me. E sembra essere molto veloce in quanto è solo un'interfaccia per ARPACK, il pacchetto standard per l'algebra lineare sparsa (che significa calcolare alcuni autovalori e autovettori).


Benvenuto in SciComp! Come afferma la domanda, ARPACK non funziona per l'OP, quindi questa risposta non è davvero utile.
Christian Clason,

@HoangDT Questa domanda precede RARPACK
potenza
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.