Diagonalizzazione di matrici malate dense


10

Sto cercando di diagonalizzare alcune matrici dense e mal condizionate. Nella precisione della macchina, i risultati non sono accurati (restituendo autovalori negativi, gli autovettori non hanno le simmetrie previste). Sono passato alla funzione Eigensystem [] di Mathematica per sfruttare la precisione arbitraria, ma i calcoli sono estremamente lenti. Sono aperto a qualsiasi numero di soluzioni. Esistono pacchetti / algoritmi che ben si adattano a problemi mal condizionati? Non sono un esperto di precondizionamento, quindi non sono sicuro di quanto ciò possa aiutare. Altrimenti, tutto ciò che riesco a pensare sono solutori di autovalori di precisione arbitraria parallelizzati, ma non ho familiarità con nulla al di là di Mathematica, MATLAB e C ++.

Per dare qualche informazione sul problema, le matrici sono grandi, ma non enormi (da 4096x4096 a 32768x32768 al massimo). Sono reali, simmetrici e gli autovalori sono limitati tra 0 e 1 (esclusivo), con molti autovalori molto vicini a 0 e nessuno vicino a 1. La matrice è essenzialmente un operatore di convoluzione. Non ho bisogno di diagonalizzare tutte le mie matrici, ma più grande posso andare, meglio è. Ho accesso a cluster informatici con molti processori e capacità di elaborazione distribuita.

Grazie


2
Quale routine stai usando per diagonalizzare le tue reali matrici simmetriche? E in che senso la decomposizione dell'autovalore è inaccurata?
Jack Poulson,

Ecco un'idea correlata alla risposta di Arnold: esegui una decomposizione Cholesky della tua matrice SPD, quindi trova i valori singolari del triangolo Cholesky che hai appena ottenuto, possibilmente usando un algoritmo di tipo dqd per preservare l'accuratezza.
JM,

1
@JM: La formazione del decomposito di Cholesky di una matrice definita positiva numericamente singolare è numericamente instabile con il solito metodo, poiché è probabile che si incontrino perni negativi. (Ad esempio, il col (A) di Matlab in genere fallisce.) Bisognerebbe impostarli a zero e annichilire le corrispondenti file dei fattori. In questo modo si ottiene in modo affidabile lo spazio nullo numerico.
Arnold Neumaier,

@Arnold, se la memoria serve, ci sono adattamenti di Cholesky che usano un pivot simmetrico per quei casi in cui la matrice è semi- indefinita positiva (o quasi). Forse quelli potrebbero essere usati ...
JM,

@JM: non è necessario ruotare per risolvere il caso semidefinito; la ricetta che ho dato è abbastanza. Volevo solo sottolineare che non è possibile utilizzare i programmi standard standard, ma è necessario modificarli da soli.
Arnold Neumaier,

Risposte:


7

Calcola l'SVD al posto della decomposizione spettrale. I risultati sono gli stessi nell'aritmetica esatta, poiché la tua matrice è definita simmetrica positve definita, ma nell'aritmetica a precisione finita, otterrai i piccoli autovalori con molta più precisione.

Modifica: vedi Demmel & Kahan, Valori singolari accurati delle matrici bidiagonali, SIAM J. Sci. Statistica. Comput. 11 (1990), 873-912.
ftp://netlib2.cs.utk.edu/lapack/lawnspdf/lawn03.pdf

Edit2; Si noti che nessun metodo sarà in grado di risolvere autovalori più piccoli di circa la norma volte l'accuratezza della macchina utilizzata, poiché la modifica di una singola voce di un'ulp può già modificare un piccolo autovalore di così tanto. Pertanto è opportuno ottenere zero autovalori al posto di quelli molto piccoli e nessun metodo (tranne lavorare con una precisione maggiore) districherà gli autovettori corrispondenti, ma restituirà solo una base per lo spazio nullo numerico comune.


[0,BT;B,0]

2
@JackPoulson: il punto è che la forma bidiagonale determina molto meglio piccoli valori singolari. La forma tridiagonale simmetrica associata ha zeri sulla diagonale, che sono preservati dalla riduzione bidiagonale in diagonale, ma non da QR applicati alla tridiagonale.
Arnold Neumaier,

1
Riferimento? Il metodo di Jacobi è noto per essere estremamente accurato (anche se lento).
Jack Poulson,

@JackPoulson: prova a vedere. Demmel & Kahan, Valori singolari accurati delle matrici bidiagonali
Arnold Neumaier

[0,BT;B,0]

1

Grazie per questo suggerimento Ho provato il comando SVD di Mathematica, ma non ottengo alcun miglioramento evidente (mancano ancora le simmetrie appropriate, gli "autovalori" sono erroneamente zero dove prima erano erroneamente negativi). Forse avrei bisogno di implementare uno degli algoritmi che descrivi sopra invece di una funzione integrata? Probabilmente vorrei evitare di affrontare il problema di utilizzare un metodo specifico come questo a meno che non fossi sicuro in anticipo che avrebbe offerto un miglioramento significativo.

@JackPoulson, ho sfogliato il documento sul metodo di Jacobi a cui hai fatto riferimento e sembra promettente. Puoi tu o qualcuno consigliare un buon modo per implementare il metodo Jacobi per trovare gli eigensystems? Immagino che se lo codificassi da solo (in MATLAB), sarebbe estremamente lento.


Non l'ho provato, ma qui c'è un'implementazione MATLAB: groups.google.com/forum/?fromgroups#!msg/sci.math.num-analysis/…
Jack Poulson

Si noti che nessun metodo sarà in grado di risolvere autovalori più piccoli di circa la norma volte l'accuratezza della macchina utilizzata, poiché la modifica di una singola voce di un'ulp potrebbe già modificare un piccolo autovalore di così tanto. Pertanto è opportuno ottenere zero autovalori al posto di quelli molto piccoli, e nessun metodo (tranne lavorare con maggiore precisione) districherà gli autovettori corrispondenti, ma restituirà solo una base per lo spazio nullo numerico comune. A cosa servono gli autovalori?
Arnold Neumaier l'

@ArnoldNeumaier: ho eseguito alcuni test in MATLAB con autovalori nell'intervallo di [0,1], con un autovalore impostato manualmente su valori come 6.3e-16 e la routine SVD di Octave (basata su dgesvd, che utilizza la riduzione in bidiagonale e poi QR) raccoglie questi valori in modo molto più accurato dell'era di Octave. Il codice Jacobi collegato sembra essere troppo lento da usare, anche su matrici di dimensioni modeste.
Jack Poulson,

@JackPoulson: Sì. Ma Leigh sembra lamentarsi di più autovalori molto piccoli, e i loro autovettori saranno raramente quelli progettati ma si mescoleranno liberamente, indipendentemente dal metodo utilizzato. E i valori positivi molto piccoli positivi (inferiori a 1e-16) saranno ovviamente trovati zero.
Arnold Neumaier l'

@ArnoldNeumaier ha ragione sul fatto che sto trovando più autovalori molto piccoli, che suppongo aggravano il problema. Non ho realizzato (anche se a posteriori è ovvio) che gli autovalori inferiori a 1e-16 saranno zero in virgola mobile. Immagino che sebbene il numero possa essere memorizzato, si verifica un errore di arrotondamento quando lo si aggiunge a un numero maggiore. Gli autovettori mi dicono se un certo problema è risolvibile. L'autovettore consente la decomposizione del problema in parti risolvibili e non risolvibili. Se sono fondamentalmente limitato dalla precisione, allora puoi consigliare qualche pacchetto per una soluzione più veloce?
Leigh,
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.