Motivation : Ich schreibe einen Zustandsschätzer in MATLAB (dem nicht parfümierten Kalman-Filter), der die Aktualisierung der (oberen Dreiecks-) Quadratwurzel einer Kovarianzmatrix bei jeder Iteration ( dh für eine Kovarianzmatrix P ) fordert ist es wahr, dass P = S S T ). Damit ich die erforderlichen Berechnungen durchführen kann, muss ich mithilfe der MATLAB- Funktion ein Cholesky-Update und -Downdate vom Rang 1 durchführen .cholupdate
Problem : Leider kann diese Matrix im Verlauf der Iterationen manchmal an positiver Bestimmtheit verlieren. Das Cholesky-Downdate schlägt bei Nicht-PD-Matrizen fehl.
Meine Frage ist : Gibt es in MATLAB einfache und zuverlässige Möglichkeiten, positiv-definitiv zu machen ?
( oder allgemeiner, gibt es eine gute Möglichkeit, eine bestimmte Kovarianz- Matrix positiv-definitiv zu machen? )
Anmerkungen :
- ist voller Rang
- Ich habe den Eigendekompositionsansatz ausprobiert (der nicht funktioniert hat). Dies beinhaltete im Wesentlichen das Finden von , das Setzen aller negativen Elemente von V , D = 1 × 10 - 8 und das Rekonstruieren eines neuen S ' = V ' D ' V ' T, wobei V ' , D ' nur Matrizen mit sind positive Elemente.
- Ich kenne den Higham-Ansatz (der in R as implementiert ist
nearpd
), aber er scheint nur auf die nächste PSD-Matrix zu projizieren. Ich benötige eine PD-Matrix für das Cholesky-Update.
quelle
Antworten:
Hier ist Code, den ich in der Vergangenheit verwendet habe (unter Verwendung des SVD-Ansatzes). Ich weiß, dass du gesagt hast, du hast es bereits versucht, aber es hat immer bei mir funktioniert, also dachte ich, ich würde es posten, um zu sehen, ob es hilfreich ist.
quelle
[V,D] = eig(A); D(D <= 1e-10) = 1e-6; Apd = V*A*V';
. Dieser Ansatz ähnelt dem von Rebonato und Jackel und scheint in pathologischen Fällen wie meinem fehlzuschlagen.in Matlab:
Ich bekomme
quelle
cholupdate
aber meine Frage ist,R
(in diesem Fall) positiv definitiv zu machen. Ich habe einen Fall, in dem meinR
nicht pd ist undcholupdate(R,X,'-')
(ein Downdate) fehlschlägt.cholupdate
beizubehalten und, wenn dies fehlschlägt, die Kovarianz basierend auf diesem zirkulären Puffer neu zu berechnen und die Kosten zu essen. Wenn Sie über den Arbeitsspeicher verfügen und in diesem Fall gelegentlich Zeit sparen können, werden Sie keine bessere Methode in Bezug auf Genauigkeit und einfache Implementierung finden.Eine alternative Methode zur Berechnung der Cholesky-Faktorisierung besteht darin, die diagonalen Elemente von S auf 1 zu fixieren und dann eine diagonale Matrix D mit positiven Elementen einzuführen.
Dies vermeidet die Notwendigkeit, bei den Berechnungen Quadratwurzeln zu ziehen, was zu Problemen beim Umgang mit "kleinen" Zahlen führen kann (dh Zahlen, die klein genug sind, damit die Rundung aufgrund von Gleitkommaoperationen von Bedeutung ist). Auf der Wikipedia-Seite sehen Sie, wie dieser angepasste Algorithmus aussieht.
Hoffe das hilft!
quelle
Tatsächlich kann die Cholesky-Faktorisierung fehlschlagen, wenn Ihre Matrix nicht "wirklich" positiv ist. Es treten zwei Fälle auf, oder Sie haben einen negativen Eingen-Wert oder Ihr kleinster Eingen-Wert ist positiv, aber nahe Null. Der zweite Fall muss theoretisch eine Lösung geben, ist aber numerisch schwierig. Wenn Sie nur intuitiv sind, fügen Sie der Diagonale meiner Matrix eine kleine Konstante hinzu, um das Problem zu lösen. Dieser Weg ist jedoch nicht streng, da er die Lösung geringfügig verändert. Wenn Sie eine wirklich hochgenaue Lösung berechnen müssen, versuchen Sie es mit Untersuchungen zur modifizierten Cholesky-Faktorisierung.
quelle
Wenn Sie versuchen, mit P nicht positiv definitiv zu schätzen, fragen Sie nach Problemen und Chalenging-Algorithmen, sollten Sie diese Situation vermeiden. Wenn Ihr Problem numerisch ist: P ist positiv definit, aber der numerische Eigenwert ist zu klein - versuchen Sie eine neue Abwertung für Ihre Zustände. Wenn Ihr Problem tatsächlich nicht positiv definit ist - versuchen Sie es mit einem anderen Satz von Zustandsvariablen. Ich hoffe, der Rat kommt nicht zu spät. Grüße, Zeev
quelle