Saya sedang mengerjakan perpustakaan matriks header-only untuk memberikan tingkat kemampuan aljabar linier yang masuk akal dalam paket sesederhana mungkin, dan saya mencoba mensurvei seperti apa keadaan seni saat ini: menghitung SVD dari sebuah matriks kompleks.
Saya sedang melakukan dekomposisi dua fase, bidiagonisasi diikuti oleh perhitungan nilai singular. Saat ini saya menggunakan metode rumah tangga untuk bidiagonisasi (saya percaya LAPACK juga menggunakan ini), dan saya pikir itu sama baiknya dengan yang didapat saat ini (kecuali jika seseorang mengetahui algoritma untuk itu..).
Perhitungan nilai singular adalah yang berikutnya dalam daftar saya, dan saya agak keluar dari lingkaran tentang apa algoritma umum untuk melakukan ini. Saya membaca di sini bahwa penelitian sedang menuju ke metode iterasi terbalik yang menjamin ortogonalitas dengan kompleksitas . Saya akan tertarik mendengar tentang itu atau kemajuan lainnya.
Jawaban:
"Algoritma acak" baru-baru ini menjadi sangat populer untuk sebagian svds. Implementasi header saja dapat diunduh di sini: http://code.google.com/p/redsvd/
Peninjauan metode saat ini dapat ditemukan di sini: http://arxiv.org/abs/0909.4061
Untuk svds penuh, saya tidak yakin apakah Anda bisa melakukan lebih baik daripada Householder.
sumber
(Saya hanya ingin membuat beberapa komentar karena saya tidak punya waktu untuk menulis rincian, tetapi itu agak besar untuk kotak komentar.)
Yang saya yakini akan menjadi algoritma MRRR (beberapa representasi yang relatif kuat) dari Dhillon dan Parlett. Ini berakar pada karya sebelumnya oleh Fernando, yang pada gilirannya terinspirasi oleh masalah yang ditimbulkan oleh Jim Wilkinson dalam buku monumentalnya tentang masalah nilai eigen. Bagian "iterasi terbalik" untuk memperoleh vektor singular berakar dalam konsep "faktorisasi bengkok" oleh Fernando , yang memanfaatkan matriks faktorisasi menjadi dan dekomposisi .U D U ⊤LDL⊤ UDU⊤
Bagian "nilai singular" dari algoritma, di sisi lain, berasal dari algoritme perbedaan selisih (bergeser) (dqd) , yang merupakan puncak dari karya sebelumnya oleh Fernando, Parlett , Demmel dan Kahan (dengan inspirasi dari Heinz Rutishauser).
Seperti yang Anda ketahui metode SVD biasanya melanjutkan dengan dekomposisi bidiagonal terlebih dahulu sebelum nilai singular diperoleh dari matriks bidiagonal. Sayangnya saya tidak terlalu memperbarui metode terbaik saat ini untuk dekomposisi bidiagonal front-end; Terakhir saya periksa, metode yang biasa adalah mulai dengan dekomposisi QR dengan pivoting kolom dan kemudian menerapkan transformasi ortogonal dengan tepat pada faktor segitiga untuk akhirnya mendapatkan dekomposisi bidiagonal.
Saya mengerti bahwa saya kurang detail; Saya akan mencoba menyempurnakan jawaban ini lebih jauh setelah saya memiliki akses ke perpustakaan saya ...
sumber
Ada perpustakaan PROPACK dan nu-TRLan.
http://soi.stanford.edu/~rmunk/PROPACK/
http://crd-legacy.lbl.gov/~kewu/trlan/
sumber