Faktorisasi Cholesky paling masuk akal untuk stabilitas dan kecepatan terbaik ketika Anda bekerja dengan matriks kovarians, karena matriks kovarians akan menjadi matriks simetris semi-pasti positif. Cholesky alami di sini. TAPI...
JIKA Anda bermaksud menghitung faktorisasi Cholesky, sebelum Anda menghitung matriks kovarians, bantulah diri Anda. Buat masalah stabil secara maksimal dengan menghitung faktorisasi QR matriks Anda. (A QR juga cepat.) Yaitu, jika Anda akan menghitung matriks kovarians sebagai
C=ATA
di mana memiliki kolom yang berarti dihilangkan, lalu perhatikan bahwa ketika Anda membentuk C , itu kuadrat nomor kondisi. Jadi yang lebih baik adalah membentuk faktor-faktor QR dari A daripada secara eksplisit menghitung faktorisasi Cholesky dari A TACA .ATA
A=QR
Karena Q adalah orthogonal,
C=(QR)TQR=RTQTQR=RTIR=RTR
Dengan demikian kita mendapatkan faktor Cholesky langsung dari faktorisasi QR, dalam bentuk . Jika Q -kurang QR faktorisasi tersedia, ini bahkan lebih baik karena Anda tidak perlu Q . Sebuah Q -kurang QR adalah hal yang cepat untuk menghitung, karena Q tidak pernah dihasilkan. Itu hanya menjadi urutan transformasi Householder. (Kolom diputar, Q- tanpa QR secara logis akan menjadi lebih stabil, dengan biaya beberapa pekerjaan tambahan untuk memilih pivot.)RTQQQQQ
Keutamaan besar menggunakan QR di sini adalah sangat stabil secara numerik pada masalah yang tidak menyenangkan. Sekali lagi, ini karena kita tidak pernah harus membentuk matriks kovarians secara langsung untuk menghitung faktor Cholesky. Segera setelah Anda membentuk produk , Anda kuadratkan nomor kondisi matriks. Secara efektif, Anda kehilangan informasi di bagian-bagian dari matriks di mana Anda awalnya memiliki sedikit informasi untuk memulai.ATA
Akhirnya, seperti yang ditunjukkan oleh respons lain, Anda bahkan tidak perlu menghitung dan menyimpan invers sama sekali, tetapi menggunakannya secara implisit dalam bentuk backsolves pada sistem segitiga.
Saya melakukan ini untuk pertama kalinya baru-baru ini, menggunakan saran dari mathSE.
SVD direkomendasikan oleh sebagian besar saya, tetapi saya memilih untuk kesederhanaan Cholesky:
Jika matriks , maka saya menguraikan M ke matriks segitiga L menggunakan Cholesky, sehingga M = L L ⊤ . Saya kemudian menggunakan substitusi balik atau substitusi ke depan (tergantung pada apakah saya memilih L menjadi segitiga atas atau bawah), untuk membalikkan L , sehingga saya memiliki L - 1 . Dari sini, saya dapat dengan cepat menghitung M - 1 = ( L L ⊤ ) - 1 = L - ⊤ L - 1 .M=AA⊤ M L M=LL⊤ L L−1 M−1=(LL⊤)−1=L−⊤L−1
Dimulai dari:
, di mana M diketahui dan secara implisit simetris dan juga positif-pasti.M=AA⊤ M
Factorisation Cholesky:
, di mana L adalah persegi dan non-tunggalM→LL⊤ L
Substitusi kembali:
, mungkin cara tercepat untuk membalikkan L (jangan mengutip saya tentang itu)L→L−1 L
Perkalian:
Notasi yang digunakan: Indeks yang lebih rendah adalah baris, indeks atas adalah kolom dan adalah transposes dari L - 1L−⊤ L−1
Algoritma Cholesky saya (mungkin dari Numerical Recipes atau Wikipedia)
Ini hampir dapat dilakukan di tempat (Anda hanya perlu penyimpanan sementara untuk elemen diagonal, akumulator dan beberapa iterator integer).
Algoritma back-substitusi saya (dari Numerical Recipes, periksa versinya karena saya mungkin telah membuat kesalahan dengan markup LaTeX)
sumber
Jika Anda tahu bahwa matriks memiliki kebalikan (yaitu, jika memang pasti positif) dan jika tidak terlalu besar, maka dekomposisi Cholesky memberikan cara yang tepat untuk menandai kebalikan dari matriks.
sumber