Motivasi : Saya sedang menulis estimator keadaan di MATLAB (filter Kalman tanpa pewangi), yang menyerukan pembaruan akar kuadrat (segitiga-atas) dari matriks kovarians pada setiap iterasi (yaitu, untuk matriks kovarian , memang benar bahwa ). Agar saya dapat melakukan perhitungan yang diperlukan, saya perlu melakukan Update dan Downdate Cholesky Rank-1 menggunakan fungsi MATLAB .cholupdate
Masalah : Sayangnya, selama iterasi, matriks ini terkadang dapat kehilangan kepastian positif. Downdate Cholesky gagal pada matriks non-PD.
Pertanyaan saya adalah : adakah cara sederhana dan dapat diandalkan dalam MATLAB untuk membuat positif-pasti?
( atau lebih umum, apakah ada cara yang baik untuk membuat matriks kovarian tertentu pasti-positif? )
Catatan :
- adalah peringkat penuh
- Saya sudah mencoba pendekatan eigendecomposition (yang tidak berhasil). Ini pada dasarnya melibatkan menemukan , mengatur semua elemen negatif dari , dan merekonstruksi mana adalah matriks dengan hanya elemen positif.
- Saya menyadari pendekatan Higham (yang diimplementasikan dalam R as
nearpd
), tetapi tampaknya hanya memproyeksikan ke matriks PSD terdekat. Saya memerlukan matriks PD untuk pembaruan Cholesky.
sumber
Jawaban:
Berikut adalah kode yang saya gunakan di masa lalu (menggunakan pendekatan SVD). Saya tahu Anda mengatakan Anda sudah mencobanya, tetapi selalu berhasil, jadi saya pikir saya akan mempostingnya untuk melihat apakah itu membantu.
sumber
[V,D] = eig(A); D(D <= 1e-10) = 1e-6; Apd = V*A*V';
). Pendekatan ini mirip dengan yang dilakukan oleh Rebonato dan Jackel, dan tampaknya gagal untuk kasus-kasus patologis seperti milik saya.di Matlab:
saya mendapat
sumber
cholupdate
tetapi pertanyaan saya adalah tentang membuatR
(dalam hal ini) pasti positif. Saya memiliki kasus di manaR
non-pd saya, dancholupdate(R,X,'-')
(downdate) gagal.cholupdate
gagal, menghitung ulang kovarians berdasarkan buffer melingkar itu dan memakan biayanya. Jika Anda memiliki memori, dan dapat bertahan dengan waktu sesekali ketika ini terjadi, Anda tidak akan menemukan metode yang lebih baik dalam hal akurasi dan kemudahan implementasi.Salah satu cara alternatif untuk menghitung factorisation Cholesky adalah dengan memperbaiki elemen diagonal S ke 1, dan kemudian memperkenalkan matriks diagonal D, dengan elemen positif.
Ini menghindari kebutuhan untuk mengambil akar kuadrat ketika melakukan perhitungan, yang dapat menyebabkan masalah ketika berhadapan dengan angka "kecil" (yaitu angka yang cukup kecil sehingga pembulatan yang terjadi karena operasi floating point penting). The halaman wikipedia memiliki apa ini disesuaikan algoritma terlihat seperti.
Jadi, bukannyaP=SST Anda mendapatkan P=RDRT dengan S=RD12
Semoga ini membantu!
sumber
Secara efektif faktorisasi Cholesky dapat gagal ketika matriks Anda tidak "benar-benar" pasti positif. Dua kasus muncul, atau Anda memiliki nilai eingen negatif, atau nilai eingen terkecil Anda adalah positif, tetapi mendekati nol. Kasus kedua harus secara teoretis memberikan solusi, tetapi sulit secara numerik. Jika baru saja intuitif tambahkan konstanta kecil ke diagonal dari matriks saya untuk menyelesaikan masalah. Tetapi cara ini tidak sulit karena hanya sedikit memodifikasi solusi. Jika Anda harus menghitung solusi akurasi yang sangat tinggi, coba riset tentang faktorisasi Cholesky yang dimodifikasi.
sumber
Jika Anda mencoba memperkirakan dengan P tidak pasti positif Anda meminta masalah dan algoritma tantangan, Anda harus menghindari situasi ini. Jika masalah Anda numerik: P pasti pasti tetapi nilai eigen numeriknya terlalu kecil - coba scalling baru untuk status Anda. Jika masalah Anda memang tidak pasti pasti positif - coba berbagai set variabel keadaan. Saya harap nasihatnya tidak terlambat Salam, Zeev
sumber