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 igraph
paket 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.
EDIT2: Jika saya memiliki beberapa matriks yang saya "uji" dan saya tahu bahwa ada submatrix besar yang tidak bervariasi. Apakah mungkin untuk mengabaikan / membuangnya?
sumber
Jawaban:
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.
sumber
The Daya Iterasi (atau Metode Power), misalnya apa Dan menggambarkan, harus selalu bertemu, meskipun pada tingkat.|λn−1/λ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.λn−1 λn
sumber
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.
sumber
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).
sumber
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.
sumber
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.
sumber
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).
sumber