Apa cara tercepat untuk menghitung nilai eigen terbesar dari matriks umum?


27

EDIT: Saya menguji apakah ada nilai eigen yang besarnya satu atau lebih.

Saya perlu menemukan nilai eigen absolut terbesar dari matriks besar non-simetris yang jarang.

Saya telah menggunakan eigen()fungsi R , yang menggunakan algo QR baik dari EISPACK atau LAPACK untuk menemukan semua nilai eigen dan kemudian saya gunakan abs()untuk mendapatkan nilai absolut. Namun, saya harus melakukannya lebih cepat.

Saya juga telah mencoba menggunakan antarmuka ARPACK dalam igraphpaket R. Namun, itu memberikan kesalahan untuk salah satu matriks saya.

Implementasi akhir harus dapat diakses dari R.

Mungkin akan ada beberapa nilai eigen dengan magnitudo yang sama.

Apakah Anda punya saran?

EDIT: Akurasi hanya perlu dilakukan untuk 1e-11. Matriks "tipikal" sejauh ini adalah . Saya telah dapat melakukan factorisation QR di atasnya. Namun, juga dimungkinkan untuk memiliki yang lebih besar. Saat ini saya mulai membaca tentang algoritma Arnoldi. Saya mengerti bahwa ini terkait dengan Lanczsos.386×386

EDIT2: Jika saya memiliki beberapa matriks yang saya "uji" dan saya tahu bahwa ada submatrix besar yang tidak bervariasi. Apakah mungkin untuk mengabaikan / membuangnya?


Lihat jawaban saya di sini: scicomp.stackexchange.com/a/1679/979 . Ini adalah topik penelitian saat ini dan metode saat ini dapat melakukan lebih baik daripada Lanczos. Masalah penghitungan nilai singular setara dengan masalah penghitungan nilai eigen.
dranxo

2
400x400 matriks! = Besar. Juga apa yang terbesar artinya jika "Mungkin akan ada beberapa nilai eigen dengan besaran yang sama." Di tanah numpy: linalg.eig (random.normal (size = (400.400))) membutuhkan sekitar setengah detik. Apakah ini terlalu lambat?
meawoppl

@meawoppl ya setengah detik terlalu lambat. Ini karena itu adalah bagian dari algo lain yang menjalankan perhitungan ini berkali-kali.
kekuatan

1
@power Gotcah. Apakah Anda memiliki perkiraan ke vektor eigen. yaitu apakah kemungkinannya mirip dengan solusi terakhir, atau dapatkah Anda menebak tentang strukturnya?
meawoppl

Jawaban:


14

Itu sangat tergantung pada ukuran matriks Anda, dalam kasus skala besar juga pada apakah itu jarang, dan pada akurasi yang ingin Anda capai.

Jika matriks Anda terlalu besar untuk memungkinkan faktorisasi tunggal, dan Anda membutuhkan akurasi tinggi, algoritma Lanczsos mungkin adalah cara tercepat. Dalam kasus nonsimetris, algoritma Arnoldi diperlukan, yang secara numerik tidak stabil, sehingga implementasi perlu mengatasi ini (agak canggung untuk disembuhkan).

Jika ini bukan masalah Anda, berikan informasi yang lebih spesifik dalam pertanyaan Anda. Kemudian tambahkan komentar ke jawaban ini, dan saya akan memperbaruinya.

Sunting: [Ini untuk versi lama dari pertanyaan, mencari nilai eigen terbesar.] Karena matriks Anda kecil dan tampaknya padat, saya akan melakukan iterasi Arnoldi pada B = (IA) ^ {- 1}, menggunakan inisial faktorisasi segitiga IA yang diizinkan untuk memiliki perkalian murah dengan B. (Atau menghitung inversi eksplisit, tetapi biayanya 3 kali lipat dari faktorisasi.) Anda ingin menguji apakah B memiliki nilai eigen negatif. Bekerja dengan B di tempat A, nilai eigen negatif jauh lebih baik dipisahkan, jadi jika ada, Anda harus bertemu dengan cepat.

Tapi saya ingin tahu dari mana masalah Anda berasal. Matriks nonsimetrik biasanya memiliki nilai eigen yang kompleks, jadi '' terbesar '' bahkan tidak terdefinisi dengan baik. Dengan demikian Anda harus tahu lebih banyak tentang masalah Anda, yang mungkin bisa membantu dalam menyarankan bagaimana menyelesaikannya lebih cepat dan / atau lebih andal.

Sunting2: Sulit untuk mendapatkan dengan Arnoldi bagian tertentu yang menarik. Untuk mendapatkan nilai eigen yang benar-benar terbesar secara andal, Anda harus melakukan iterasi ruang bagian menggunakan matriks asli, dengan ukuran ruang bagian yang cocok atau melebihi jumlah nilai eigen yang diperkirakan mendekati 1 atau lebih besar dalam besarnya. Pada matriks kecil, ini akan lebih lambat daripada algoritma QR tetapi pada matriks besar akan jauh lebih cepat.


Saya perlu menguji apakah nilai eigen terbesar lebih besar dari 1. Akurasi hanya perlu 1e-11. Matriks "tipikal" sejauh ini adalah 386 x 386. Saya telah dapat melakukan factorisation QR di atasnya. Namun, juga dimungkinkan untuk memiliki yang lebih besar. Saat ini saya mulai membaca tentang algoritma Arnoldi. Saya mengerti bahwa ini terkait dengan Lanczsos.
kekuatan

Informasi ini milik pertanyaan Anda - jadi harap edit, dan tambahkan juga informasi lebih lanjut (mengapa nilai eigen nyata? Atau apa arti terbesar?) - lihat hasil edit jawaban saya.
Arnold Neumaier

maaf saya tidak menjelaskan diri saya dengan jelas. Saya juga tidak menjelaskan dengan jelas bahwa nilai eigennya kompleks. Saya menguji apakah ada nilai eigen yang besarnya satu atau lebih.
kekuatan

1
Ini lebih masuk akal, tapi sekarang resep saya dengan berfungsi dengan baik hanya jika nilai eigen yang buruk memang nyata> 1. Di sisi lain, info baru mungkin menyiratkan bahwa Anda memiliki banyak pilihan selain menghitung semua nilai eigen. - Harap perbarui pertanyaan Anda untuk menyampaikan info tambahan! (IA)1
Arnold Neumaier

1
lihat edit 2 dalam jawaban saya
Arnold Neumaier

7

The Daya Iterasi (atau Metode Power), misalnya apa Dan menggambarkan, harus selalu bertemu, meskipun pada tingkat.|λn1/λn|

Jika dekat dengan , itu akan lambat, tetapi Anda dapat menggunakan ekstrapolasi untuk menyiasatinya. Ini mungkin terlihat rumit, tetapi implementasi dalam pseudo-code diberikan di koran.λn1λn


1
bagaimana jika | λ (n − 1) | = | λ (n) | ?
Kekuatan

@ power, maka Power Iteration biasa tidak akan bertemu. Saya tidak tahu seberapa baik metode ekstrapolasi akan membedakan antara nilai eigen yang berbeda, Anda harus membaca makalah untuk itu.
Pedro

2
|λn1|=|λn|λnλn1

apakah Anda memiliki referensi ke makalah akademis atau buku yang mendukung ini? Juga, bagaimana jika \ lambda_ {n} kompleks?
power

5
Jika ada beberapa nilai eigen berbeda dari modulus maksimal, iterasi daya hanya bertemu dalam keadaan luar biasa. Biasanya berosilasi dalam cara yang agak tidak terduga.
Arnold Neumaier

5

Ada beberapa penelitian bagus tentang ini baru-baru ini. Pendekatan baru menggunakan "algoritma acak" yang hanya membutuhkan beberapa bacaan dari matriks Anda untuk mendapatkan akurasi yang baik pada nilai eigen terbesar. Ini berbeda dengan iterasi daya yang membutuhkan beberapa perkalian matriks-vektor untuk mencapai akurasi tinggi.

Anda dapat membaca lebih lanjut tentang penelitian baru di sini:

http://math.berkeley.edu/~strain/273.F10/martinsson.tygert.rokhlin.randomized.decomposition.pdf

http://arxiv.org/abs/0909.4061

Kode ini akan melakukannya untuk Anda:

http://cims.nyu.edu/~tygert/software.html

https://bitbucket.org/rcompton/pca_hgdp/raw/be45a1d9a7077b60219f7017af0130c7f43d7b52/pca.m

http://code.google.com/p/redsvd/

https://cwiki.apache.org/MAHOUT/stochastic-singular-value-decomposition.html

Jika bahasa pilihan Anda tidak ada di sana, Anda dapat menggulung SVD acak Anda sendiri dengan mudah; itu hanya membutuhkan perkalian vektor matriks diikuti oleh panggilan ke SVD off-the-shelf.


4

Di sini Anda akan menemukan pengantar algoritmik untuk algoritma Jacobi-Davidson, yang menghitung nilai eigen maksimum.

Dalam makalah ini aspek matematika dieksplorasi. JD memungkinkan matriks umum (nyata atau kompleks) dan dapat digunakan untuk menghitung rentang nilai eigen.

Di sini Anda dapat menemukan berbagai implementasi perpustakaan JDQR dan JDQZ (termasuk antarmuka C, yang harus Anda tautkan dari R).


Saya belum dapat menemukan literatur yang secara eksplisit menyatakan bahwa metode Jacobi-Davidson bekerja untuk matriks umum yang nyata.
kekuatan

Kecuali jika setiap artikel secara eksplisit menyatakan pembatasan dan argumen konvergensi bergantung pada pembatasan yang tidak masalah.
Deathbreath

Berikut ini penjelasan lain dari JD. Matriks yang dianggap sepenuhnya umum. Tidak ada struktur khusus yang dieksploitasi dan hasil yang spesifik untuk matriks Hermitian dibandingkan dan dikontraskan, misalnya, konvergensi untuk matriks umum adalah kuadratik, tetapi kubik untuk matriks Hermitian.
Deathbreath

Terima kasih untuk ini. Saya tidak menemukan kode C untuk matriks umum, jadi saya harus menulis sendiri. Tautan ke algoritme tampaknya hanya untuk matriks Hermetian.
kekuatan

1
@power Anda juga tidak akan menemukan dalam literatur hasil yang menyatakan bahwa implementasi standar QR bertemu untuk matriks umum nyata - yang merupakan masalah terbuka, dan memang beberapa waktu lalu sebuah counterexample ditemukan untuk kode QR di LAPACK.
Federico Poloni

2

Di posting asli Anda, Anda mengatakan:

"Saya juga mencoba menggunakan antarmuka ARPACK dalam paket igraph R. Namun, itu memberikan kesalahan untuk salah satu matriks saya."

Saya akan tertarik untuk mengetahui lebih banyak tentang kesalahan tersebut. Jika Anda dapat membuat matriks ini tersedia untuk umum, saya akan tertarik untuk mencoba ARPACK.

Berdasarkan apa yang saya baca di atas, saya berharap ARPACK akan melakukan pekerjaan yang sangat baik untuk mengekstraksi nilai eigen terbesar (atau beberapa yang terbesar) dari matriks jarang. Untuk lebih spesifik, saya berharap metode Arnoldi bekerja dengan baik untuk kasus ini dan, tentu saja, itulah yang menjadi dasar ARPACK.

Konvergensi lambat dari metode daya ketika ada nilai eigen yang berjarak dekat di wilayah yang diinginkan disebutkan di atas. Arnoldi meningkatkan ini dengan mengulangi dengan beberapa vektor, bukan yang ada di metode daya.


Saya akan melihat apakah saya dapat menemukan pekerjaan saya saat itu. Saya mengerjakan ini satu tahun yang lalu.
kekuatan

0

Ini bukan cara tercepat , tetapi cara yang cukup cepat adalah dengan menekan vektor (awalnya acak) dengan matriks berulang kali, dan kemudian menormalkan setiap beberapa langkah. Akhirnya ia akan konvergen ke vektor eigen terbesar, dan gain dalam norma untuk satu langkah adalah nilai eigen terkait.

Ini bekerja paling baik ketika nilai eigen terbesar secara substansial lebih besar daripada nilai eigen lainnya. Jika nilai eigen lain dekat besarnya dengan yang terbesar, ini akan membutuhkan waktu untuk konvergen, dan mungkin sulit untuk menentukan apakah itu telah konvergen.


1
Terima kasih Dan, bagaimanapun: dalam matriks saya, beberapa nilai eigen lainnya akan memiliki besaran yang serupa (jika tidak sama) dengan yang terbesar. Apakah metode Anda mirip dengan Power Iteration dan Rayleigh Quotient Iteration? Batterson dan Smillie (1990) menulis bahwa untuk beberapa matriks non-simetri, Rayleigh Quotient Iteration tidak akan bertemu. Batterson, S., Smillie, J (1990) "Rayleigh Quotient Iteration for Nonsymmetric Matrices", Matematika Komputasi, vol 55, num 191, P 169 - 178
power

Jika nilai eigen lainnya memiliki besaran yang sama dengan yang terbesar ... maka bukankah nilai-nilai itu juga "yang terbesar" juga?
ely

@ EMS: Mereka masih akan menjadi "nilai eigen terbesar" tetapi keberadaan lebih dari satu terbesar masih akan membunuh konvergensi.
Dan

Saya hanya ingin tahu nilai eigen mana yang ingin Anda konvergen. Hal-hal seperti metode Rayleigh quotient / Power dimaksudkan ketika ada nilai eigen terbesar yang berbeda. Pertanyaan Anda meminta untuk menemukan nilai eigen terbesar, tetapi kemudian kedengarannya seperti ini tidak didefinisikan dengan baik untuk masalah Anda. Saya hanya disesatkan oleh judul tulisan.
ely

-1

Paket R racksack bekerja untuk saya. Dan tampaknya sangat cepat karena ini hanya sebuah antarmuka untuk ARPACK, paket standar untuk aljabar linier yang jarang (artinya menghitung beberapa nilai eigen dan vektor eigen).


Selamat datang di SciComp! Seperti yang dinyatakan dalam pertanyaan, ARPACK tidak berfungsi untuk OP, jadi jawaban ini tidak terlalu membantu.
Christian Clason

@HoangDT Pertanyaan ini ada sebelum rARPACK
power
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.