Saya mencoba mencari tahu apakah ada cara yang lebih cepat untuk menghitung semua nilai eigen dan vektor eigen dari matriks adjacency yang sangat besar dan jarang daripada menggunakan scipy.sparse.linalg.eigsh Sejauh yang saya tahu, metode ini hanya menggunakan sparseness dan atribut simetri dari matriks. Matriks adjacency juga biner, yang membuat saya berpikir ada cara yang lebih cepat untuk melakukannya.
Saya membuat matriks adjacency jarang 1000x1000 acak, dan membandingkan antara beberapa metode di laptop x230 ubuntu 13.04 saya:
- scipy.sparse.linalg.eigs: 0,65 detik
- scipy.sparse.linalg.eigsh: 0,44 detik
- scipy.linalg.eig: 6.09 detik
- scipy.linalg.eigh: 1,60 detik
Dengan sedikit eigsh dan eigsh, saya menetapkan k, nilai eigen yang diinginkan dan vektor eigen, menjadi pangkat matriks.
Masalahnya dimulai dengan matriks yang lebih besar - pada matriks 9000x9000, butuh scipy.sparse.linalg.eigsh 45 menit!
sumber
Jawaban:
FILTLAN adalah perpustakaan C ++ untuk menghitung nilai eigen interior matriks simetris yang jarang. Fakta bahwa ada seluruh paket yang ditujukan untuk ini hanya akan memberi tahu Anda bahwa itu adalah masalah yang cukup sulit. Menemukan beberapa nilai eigen terbesar atau terkecil dari matriks simetris dapat dilakukan dengan menggeser / membalikkan dan menggunakan algoritma Lanczos, tetapi bagian tengah spektrum adalah masalah lain. Jika Anda ingin menggunakan ini, Anda dapat menggunakan SWIG untuk memanggil program C ++ dari python.
Jika tujuan akhir Anda adalah menghitung kekuatan besar dari matriks, Anda bisa menghitung vektor eigen yang sesuai dengan nilai eigen terbesar, konten dalam pengetahuan bahwa mode yang lebih kecil akan kurang penting ketika Anda mengambil kekuatan besar.
Maafkan saya jika ini sudah jelas bagi Anda: Anda dapat mengeksploitasi sifat biner dari matriks dengan memberi tahu numpy bahwa itu terdiri dari bilangan bulat bukan mengapung, katakan dengan menggunakan
Anda juga dapat menjelajahi memanggil perpustakaan aljabar linier paralel tipis seperti CUSP atau cuSPARSE dari Python jika kecepatan menjadi perhatian Anda dan Anda memiliki GPU NVIDIA.
sumber
Saya ingin mengomentari jawaban Daniel Shapero tetapi saya tidak memiliki reputasi SE yang cukup.
Jawaban yang diterima membingungkan saya banyak. Saya pikir mode shift-invert dapat dengan mudah digunakan untuk menghitung nilai eigen interior. Lihat: https://docs.scipy.org/doc/scipy/reference/tutorial/arpack.html
Untuk menjawab pertanyaan awal: jarang terjadi bahwa Anda ingin semua nilai eigen dari matriks jarang besar. Biasanya, Anda ingin ekstra atau sekelompok nilai interior. Dalam hal ini, untuk matriks Hermitian
eigsh
lebih cepat. Untuk non-Hermitian, Anda harus ikuteigs
. Dan mereka jauh lebih cepat daripada numpyeig
ataueigh
.sumber