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.
Jika saya hanya memanggil svd
rutin dari numpy.linalg
modul dengan Python untuk matriks acak ukuran ini, saya mengalami kesalahan memori. Hal ini disebabkan alokasi untuk dekomposisi A = V S U .
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.
full_matrices
yang disetel ke False sehingga hanya bagian 'bukan nol' yang dihitung. Namun demikian, adakah cara untuk mengurangi perhitungan lebih jauh?numpy
backend menggunakan kode fortran, yangLAPACKE_dgesvd
rutin untuk svd standar. Namun, biasanya matriks Anda adalahC_CONTIGOUS
(periksa denganmatrix.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.Jawaban:
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).
sumber
Lihatlah sklearn.decomposition.TruncatedSVD di scikit-learn 0.14-rc.
(Saya percaya bahwa orang-orang yang belajar scikit mengikuti stackoverflow.com/questions/tagged/scikit-learn , jadi saya akan mengajukan pertanyaan terperinci di sana.)
sumber
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.
sumber
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.
sumber