Implementasi efisien memori Dekomposisi Nilai Singular parsial (SVD)

10

Untuk reduksi model, saya ingin menghitung vektor singular kiri terkait dengan - katakanlah 20 - nilai singular terbesar dari matriks , di mana N 10 6 dan k 10 3 . Sayangnya, matriks A saya akan padat tanpa struktur apa pun.ARN,kN106k103A

Jika saya hanya memanggil svdrutin dari numpy.linalgmodul dengan Python untuk matriks acak ukuran ini, saya mengalami kesalahan memori. Hal ini disebabkan alokasi untuk dekomposisi A = V S U .VRN,NA=VSU

Apakah ada algoritma di sekitar, yang menghindari jebakan ini? Misalnya dengan mengatur hanya vektor singular yang dikaitkan dengan nilai singular bukan nol.

Saya siap berdagang dalam waktu dan ketepatan perhitungan.

Jan
sumber
1
Menarik, sepertinya Numpy tidak tahu bagaimana melakukan SVD yang tipis ...
JM
Terima kasih atas petunjuknya. Memang, numpy.linalg.svd memiliki opsi full_matricesyang disetel ke False sehingga hanya bagian 'bukan nol' yang dihitung. Namun demikian, adakah cara untuk mengurangi perhitungan lebih jauh?
Jan
3
The numpybackend menggunakan kode fortran, yang LAPACKE_dgesvdrutin untuk svd standar. Namun, biasanya matriks Anda adalah C_CONTIGOUS(periksa dengan matrix.flags). Oleh karena itu menyalin data untuk perataan fortran. Selain itu saat menjalankan rutin lapack dgesvd salinan lain dari matriks Anda diperlukan (atau setidaknya memori untuk itu). Anda dapat menyingkirkan satu salinan jika Anda memastikan bahwa penyelarasan memori adalah gaya fortran sejak awal.
Bort,

Jawaban:

6

Jika Anda hanya ingin beberapa nilai / vektor tunggal, ARPACK harus melakukan trik. Dokumen SVD tidak bagus, dan distribusi ini lebih mutakhir.

EDIT: Jika Anda ingin melakukan ini dalam python, SciPy memiliki pembungkus . Karena matriks Anda padat, Anda bisa mencoba format blok jarang baris (BSR).

Max Hutchinson
sumber
Saya akan lihat, bagaimana ARPACK terintegrasi dengan python ...
Jan
1
Sepertinya cipy punya pembungkus. Saya akan menambahkan mereka untuk menjawab tubuh.
Max Hutchinson
2

Mungkin Anda bisa mencoba ini.

https://github.com/jakevdp/pypropack

Ini adalah pembungkus Python untuk paket PROPACK, yang mengimplementasikan dekomposisi nilai singular parsial efisien dari matriks jarang besar dan operator linier.

Misa Zhou
sumber
2

Intel MKL mengimplementasikan algoritma Jacobi-SVD baru. Berikut adalah rincian implementasinya: http://www.netlib.org/lapack/lawnspdf/lawn169.pdf http://www.fernuni-hagen.de/MATHPHYS/veselic/downloads/j02.pdf

Dan rutin LAPACK: http://software.intel.com/sites/products/documentation/hpc/mkl/mklman/GUID-732F9EE1-BCEC-4D9B-9B93-AF5499B21140.htm#DRMAC08-1

Ukuran kerja tentu saja disesuaikan. Anda dapat memanggil fungsi C dari Python dengan mudah menggunakan Cython, SWIG atau mekanisme pembungkus lainnya.

Tolga Birdal
sumber