Apa cara tercepat untuk menghitung semua nilai eigen dari matriks adjacency yang sangat besar dan jarang dalam python?

12

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!

Noam Peled
sumber
1
NB. scipy.sparse.linalg.eigsh adalah ARPACK
pv.
4
Untuk menindaklanjutinya, semakin besar matriks Anda, semakin kecil kemungkinan Anda untuk menghitung nilai eigen interior (yaitu, baik nilai eigen terbesar atau terkecil) secara akurat. Informasi apa yang Anda butuhkan dari matriks yang Anda dekomposisi?
Geoff Oxberry
1
Pertanyaan ini telah diposkan silang di sini . Saya akan merekomendasikan bahwa versi lintas-posting ditutup.
Aron Ahmadia
2
Saya ingin menghitung A ^ k. Setelah memikirkan kembali, saya pikir dengan matriks seperti itu jauh lebih cepat untuk menghitung perkalian langsung (A A A ...) rathen daripada menggunakan eigendecomposition. Tentu saja, itu tergantung pada k.
Noam Peled
2
Ya, lakukan secara langsung. Hasil dari komposisi eigend tidak jarang sehingga Anda akan memiliki masalah penyimpanan (sekali lagi, tidak ada A ^ k jika k cukup besar). Terkait stackoverflow.com/a/9495457/424631
dranxo

Jawaban:

6

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.

k

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

a = np.zeros(100,dtype=np.uint)

A16A2A4A8log2kk

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.

Daniel Shapero
sumber
1

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 eigshlebih cepat. Untuk non-Hermitian, Anda harus ikut eigs. Dan mereka jauh lebih cepat daripada numpy eigatau eigh.

Alex
sumber