Secara garis besar, ada dua pendekatan untuk menghitung nilai eigen atau dekomposisi nilai singular. Salah satu pendekatan adalah mendiagonalisasi matriks dan ini pada dasarnya menghasilkan seluruh dekomposisi nilai eigen / nilai singular (seluruh spektrum nilai eigen) pada saat yang sama, lihat beberapa tinjauan umum di sini: Apa algoritma yang efisien untuk menghitung dekomposisi nilai singular (SVD)? Alternatifnya adalah dengan menggunakan algoritma iteratif yang menghasilkan satu (atau beberapa) vektor eigen dalam satu waktu. Iterasi dapat dihentikan setelah jumlah vektor eigen yang diinginkan telah dihitung.
Saya tidak berpikir ada algoritma berulang khusus untuk SVD. Ini karena seseorang dapat menghitung SVD dari matriks B dengan melakukan eigendekomposisi dari simetris persegi ( n + m ) × ( n + m ) matriks A = ( 0 B B ⊤ 0 ) . Oleh karena itu alih-alih bertanya apa algoritma komputasi dipotong SVD, Anda harus bertanya apa yang berulang algoritma menghitung eigendecomposition: algoritma untuk dipotong SVD ≈ berulang algoritma untuk eigendecomposition .n × mB( n + m ) × ( n + m )
A = ( 0B⊤B0) .
algoritma untuk dipotong SVD ≈ berulang algoritma untuk eigendecomposition .
Algoritma iteratif yang paling sederhana disebut power iteration dan memang sangat sederhana:
- Inisialisasi acak x .
- Perbarui x ← A x .
- Normalisasi x ← x / ∥ x ∥ .
- Pergi langkah # 2 kecuali terkonvergensi.
Semua algoritma yang lebih kompleks pada akhirnya didasarkan pada ide iterasi daya, tetapi cukup canggih. Matematika yang diperlukan diberikan oleh subruang Krylov . Algoritme adalah iterasi Arnoldi (untuk matriks nonsimetrik persegi), nonsimetrik iterasi Lanczos (untuk matriks simetris persegi), dan variasi-variasi darinya seperti misalnya "metode Lanczos yang dimulai kembali secara implisit" dan yang lainnya.
Anda dapat menemukan ini dijelaskan dalam misalnya buku teks berikut:
- Pinjaman Golub & Van, Komputasi Matriks
- Trefethen & Bau, Aljabar Linear Numerik
- Demmel, Aljabar Linear Numerik Terapan
- Saad, Metode Numerik untuk Masalah Nilai Eigen Besar
Semua bahasa pemrograman dan paket statistik yang masuk akal (Matlab, R, Python numpy, sebut saja) menggunakan pustaka Fortran yang sama untuk melakukan dekomposisi eigen / nilai singular. Ini adalah LAPACK dan ARPACK . ARPACK adalah singkatan dari ARnoldi PACKage, dan ini semua tentang iterasi Arnoldi / Lanczos. Misalnya dalam Matlab ada dua fungsi untuk SVD: svd
melakukan dekomposisi penuh melalui LAPACK, dan svds
menghitung sejumlah vektor tunggal melalui ARPACK dan itu sebenarnya hanya pembungkus untuk suatueigs
panggilan pada matriks "persegi".
Memperbarui
BSEBUAHSEBUAHBSEBUAH dan dengan demikian menghemat ruang dan waktu.
Ada perpustakaan Fortran untuk metode ini juga, itu disebut PROPACK :
Paket perangkat lunak PROPACK berisi seperangkat fungsi untuk menghitung dekomposisi nilai singular matriks besar dan jarang atau terstruktur. Rutinitas SVD didasarkan pada algoritma bidiagonisasi Lanczos dengan reorthogonalization parsial (BPRO).
Namun, PROPACK tampaknya jauh lebih sedikit standar daripada ARPACK dan tidak didukung secara native dalam bahasa pemrograman standar. Buku ini ditulis oleh Rasmus Larsen yang memiliki kertas lebar dua halaman panjang 1998-halaman Lanczos tahun 1998 dengan re - reogogenisasi parsial dengan apa yang tampaknya gambaran yang bagus. Terima kasih kepada @MichaelGrant via utas Ilmu Komputasi SE ini .
Di antara makalah yang lebih baru, yang paling populer adalah Baglama & Reichel, 2005, Augmented secara implisit memulai kembali metode bidiagonisasi Lanczos , yang mungkin sekitar canggih. Terima kasih kepada @Dougal karena memberikan tautan ini di komentar.
Perbarui 2
Memang ada pendekatan yang sama sekali berbeda dijelaskan secara rinci dalam makalah tinjauan umum yang Anda kutip sendiri: Halko et al. 2009, Menemukan struktur dengan keacakan: Algoritma probabilitas untuk membangun dekomposisi matriks perkiraan . Saya tidak cukup tahu tentang hal itu untuk berkomentar.