Cepat menentukan apakah matriks padat peringkat rendah atau tidak

13

Dalam proyek perangkat lunak yang saya kerjakan, perhitungan tertentu jauh lebih mudah untuk matriks peringkat rendah yang padat. Beberapa contoh masalah melibatkan matriks peringkat rendah yang padat, tetapi mereka diberikan kepada saya secara penuh, bukan sebagai faktor, jadi saya harus memeriksa peringkat dan faktor matriks jika saya ingin mengambil keuntungan dari struktur peringkat rendah .

Matriks yang dimaksud biasanya sepenuhnya atau hampir sepenuhnya padat, dengan n berkisar dari seratus hingga beberapa ribu. Jika sebuah matriks memiliki peringkat rendah (katakanlah kurang dari 5 sampai 10), maka menghitung SVD dan menggunakannya membentuk faktorisasi peringkat rendah yang sepadan dengan usaha. Namun, jika matriksnya bukan peringkat rendah, maka upaya itu akan sia-sia.

Jadi saya ingin menemukan cara yang cepat dan cukup andal untuk menentukan apakah peringkatnya rendah atau tidak sebelum menginvestasikan upaya untuk melakukan faktorisasi SVD lengkap. Jika pada suatu saat menjadi jelas bahwa peringkat berada di atas cutoff, prosesnya dapat segera berhenti. Jika prosedur tersebut secara keliru menyatakan bahwa matriksnya berpangkat rendah ketika tidak, ini bukan masalah besar, karena saya masih akan melakukan SVD penuh untuk mengkonfirmasi peringkat rendah dan menemukan faktorisasi peringkat rendah.

Opsi yang saya pertimbangkan termasuk peringkat yang mengungkapkan LU atau faktorisasi QR diikuti oleh SVD lengkap sebagai cek. Apakah ada pendekatan lain yang harus saya pertimbangkan?

Brian Borchers
sumber

Jawaban:

8

Ada trik rapi yang baru saya pelajari dari makalah ini . Anda mulai melakukan QR yang mengungkapkan peringkat, dan berhenti setelah Refleksi Householder pertama , ketika Anda memiliki matriks bentuk [ R 1 R 12 0 R 22 ] , dengan R 1 segitiga ukuran k × k , dank

[R1R120R22],
R1k×k biasanya tidak segitiga (karena kita berhenti setelah yang pertama k iterasi dari loop utama kami). Pada titik ini, Anda memeriksa apakahR 22ε : jika ada, maka AR22kR22εAberada pada jarak paling jauh dari matriks peringkat k ; jika tidak seharusnya tidak (kecuali kesalahan numerik).εk

Prosedur ini menghabiskan biaya untuk matriks n × n yang padat .O(n2k)n×n

Federico Poloni
sumber
Ini pada dasarnya adalah pendekatan yang saya jelaskan dalam pertanyaan. Saya berpikir bahwa jawaban yang diusulkan Wolfgang Bangerth bisa melakukan lebih baik dari . O(n2k)
Brian Borchers
7

Masalahnya, tentu saja, adalah bahwa menghitung peringkat sebenarnya (misalnya, melalui dekomposisi QR) tidak benar-benar lebih murah daripada menghitung representasi matriks peringkat-rendah.

Yang terbaik yang dapat Anda lakukan adalah menggunakan algoritma acak untuk menemukan perkiraan peringkat rendah. Ini dapat, setidaknya secara teori, secara signifikan lebih cepat daripada bekerja pada seluruh matriks karena, pada dasarnya, mereka hanya menghitung dekomposisi untuk proyeksi matriks ke ruang bagian acak.

Entah itu layak untuk ukuran matriks mungkin merupakan pertanyaan yang bagus, tetapi jika masalah Anda benar-benar menjadi besar, saya akan curiga bahwa itu terbayar.100×100

Wolfgang Bangerth
sumber
Dari apa yang saya ketahui tentang algoritma ini, mereka menghasilkan matriks peringkat rendah yang cukup dekat dengan matriks yang diberikan. Saya perlu tahu apakah ada (misalnya) peringkat-10 atau kurang matriks yang sangat dekat dengan matriks yang diberikan (katakanlah kesalahan relatif 1,0e-10 atau lebih baik.)
Brian Borchers
Ya, tetapi Anda juga dapat melakukan dekomposisi QR dari matriks yang diproyeksikan (dimensi rendah) dan jika dekomposisi tersebut menunjukkan kurangnya peringkat penuh, maka Anda juga akan memiliki matriks asli yang kekurangan peringkat. Bukankah itu kriteria yang Anda butuhkan untuk melakukan dekomposisi QR pada matriks asli?
Wolfgang Bangerth
kkk1kAkknO(k2n)AO(kn2)waktu. Apakah ada matriks jarang yang mempertahankan peringkat dengan probabilitas tinggi?
Brian Borchers
k=nkkn2n3
1

Pendekatan lain yang patut dicoba adalah dengan menggunakan Adaptive Cross Approximation (ACA). Ini adalah algoritma yang cukup populer yang memiliki banyak implementasi online yang tersedia. Untuk referensi, Anda dapat melihat kertas asli:

ACA dan variasinya (katakanlah, ACA +, hybrid cross approximation HCA) dapat digunakan dalam berbagai skenario. Anda, yang sudah memiliki seluruh matriks padat dihitung adalah salah satu yang menguntungkan, karena Anda akan dapat menghitung residu persis jika diperlukan.

O(Nr)Nr(ϵ)rϵO(N2r)

Anton Menshov
sumber
0

A0xAxAATA

(ATA)A

from scipy.sparse.linalg import svds
sing = svds( A, k=20, tol=1e-4, return_singular_vectors=False )  # v0=random
# runtimes on random-normal n x n:
# n = 100, 1k, 2k
#       5, 130, 770 ms
denis
sumber