menghitung SVD terpotong, satu nilai / vektor tunggal pada suatu waktu

11

Apakah ada algoritma SVD terpotong yang menghitung nilai singular satu per satu?

Masalah saya: Saya ingin menghitung nilai singular pertama (dan vektor singular) dari matriks padat , tapi saya tidak tahu apa nilai tepat. itu besar, jadi untuk alasan efisiensi, saya lebih suka tidak mengevaluasi SVD lengkap hanya untuk memotong SV terkecil setelah itu.M k MkM.kM.

Idealnya, akan ada cara untuk menghitung nilai singular secara serial, dari terbesar ( ) hingga terkecil ( ). Dengan begitu, saya hanya bisa menghentikan perhitungan setelah menghitung th nilai singular jika turun di bawah ambang batas.σ 1 σ n k σ k / σ 1,σ1,σ2,...σ1σnkσk/σ1

Apakah ada algoritma seperti itu (lebih disukai dengan implementasi Python)? Dalam googling saya, saya hanya menemukan fungsi SVD terpotong yang menggunakan k sebagai parameter, sehingga memaksa Anda untuk menebaknya secara apriori.

SuperElectric
sumber
Apakah M kuadrat atau persegi panjang? Jika berbentuk empat persegi panjang, apakah Anda menginginkan vektor panjang tunggal atau pendek? Yaitu, jika M adalah (mxn) dengan m> n, apakah Anda mau (mxk) atau (kxn)?
Max Hutchinson
M adalah persegi panjang, dengan lebih banyak baris daripada kolom. Saya ingin vektor singular pendek (yaitu V, dalam M = U S V ^ T).
SuperElectric

Jawaban:

6

Ada beberapa opsi yang tersedia jika Anda menginginkan perkiraan faktor-faktor peringkat-k.

  1. Faktorisasi QR dengan peringkat tinggi
  2. Dekomposisi interpolatif (ID) dan teknik acak lainnya.

SEBUAH-M.NTfaktor×σk+1(SEBUAH): =ϵ

Perkiraan faktorisasi dari formulir di atas dapat dikonversi menjadi dekomposisi standar seperti QR atau SVD menggunakan teknik standar. Ulasan yang baik tersedia di surat kabar oleh Halko, Martinsson dan Tropp "Menemukan struktur dengan acak: Algoritma probabilistik untuk membangun perkiraan dekomposisi matriks"

Dalam hal perangkat lunak antarmuka untuk algoritma ID tersedia dalam scipy (scipy.linalg.interpolative) http://docs.scipy.org/doc/scipy-dev/reference/linalg.interpolative.html yang memungkinkan Anda pengguna untuk menentukan .ϵ

pengguna2457602
sumber
2

(Diedit, karena saya salah membaca pertanyaan pada awalnya; Anda sudah tahu bahwa ada rutinitas yang tersedia untuk menghitung nilai singular pertama .)k

Jika Anda mengecualikan pendekatan penghitungan seluruh SVD, sebagian algoritma SVD mengurangi menggunakan metode iteratif untuk memecahkan masalah nilai eigen Hermitian terkait. Jadi, salah satu strategi yang bisa Anda ambil adalah meng-hand-code hal ini sendiri, dan terus memecahkan untuk mendapatkan nilai tunggal terbesar yang belum terpecahkan hingga Anda ingin berhenti, menggunakan sesuatu seperti strategi shift-and-invert. Mungkin ada cara yang elegan untuk melakukan hal semacam ini dalam paket canggih seperti SLEPc .

Strategi lain adalah sebagai berikut:

  • s1
  • τs1fτ0<f1
  • Panggil rutin SVD yang jarang.

k

Geoff Oxberry
sumber
Jika Anda tidak menentukan 'k' di scipy.sparse.linalg.svds, maka defaultnya adalah k = 6, terlepas dari parameter 'tol'. Tidak jelas apakah ini bug, atau apakah 'tol' seharusnya merujuk pada keakuratan nilai singular yang dihitung (bukan ukurannya)
Nick Alger