W projekcie oprogramowania, nad którym pracuję, niektóre obliczenia są znacznie łatwiejsze dla gęstych matryc niskiej rangi. Niektóre przypadki problemów dotyczą gęstych macierzy niskiej rangi, ale są one podane mi w całości, a nie jako czynniki, więc muszę sprawdzić pozycję i matrycę macierzy, jeśli chcę skorzystać z struktury niskiej rangi .
Omawiane macierze są zazwyczaj całkowicie lub prawie całkowicie gęste, przy czym n wynosi od stu do kilku tysięcy. Jeśli matryca ma niską rangę (powiedzmy mniej niż 5 do 10), to warto obliczyć SVD i użyć jej z faktoryzacji niskiej rangi. Jeśli jednak matryca nie ma niskiej rangi, wysiłek zostałby zmarnowany.
Dlatego chciałbym znaleźć szybki i racjonalnie niezawodny sposób ustalenia, czy ranga jest niska, przed zainwestowaniem wysiłku w pełną faktoryzację SVD. Jeśli w dowolnym momencie stanie się jasne, że ranga znajduje się powyżej granicy, proces może zostać natychmiast zatrzymany. Jeśli procedura błędnie stwierdza, że matryca ma niską rangę, gdy nie jest, nie jest to ogromny problem, ponieważ nadal robiłbym pełny SVD, aby potwierdzić niską rangę i znaleźć faktoryzację niskiej rangi.
Opcje, które rozważałem, obejmują rangę ujawniającą faktoryzację LU lub QR, a następnie pełną SVD jako czek. Czy są inne podejścia, które powinienem rozważyć?
źródło
Problem polega oczywiście na tym, że obliczenie prawdziwej rangi (np. Za pomocą rozkładu QR) nie jest tak naprawdę tańsze niż obliczenie macierzy niskiego rzędu.
Najlepsze, co prawdopodobnie możesz zrobić, to użyć losowego algorytmu, aby znaleźć przybliżenia niskiej rangi. Mogą one, przynajmniej teoretycznie, być znacznie szybsze niż praca na całej macierzy, ponieważ w istocie obliczają one dekompozycje tylko dla rzutów macierzy na przypadkowe podprzestrzenie.
Czy to jest warte matrycy o rozmiarze może być dobrym pytaniem, ale jeśli twoje problemy naprawdę stają się duże, podejrzewam, że to się opłaca.100×100
źródło
Innym podejściem, które warto wypróbować, jest zastosowanie adaptacyjnej aproksymacji krzyżowej (ACA). Jest to dość popularny algorytm, który ma wiele implementacji dostępnych online. Dla porównania możesz zobaczyć oryginalny papier:
ACA i jego odmiany (powiedzmy, ACA +, hybrydowe przybliżenie krzyżowe HCA) mogą być stosowane w różnych scenariuszach. Ty, mając już obliczoną całą gęstą macierz, jesteś jedną z korzystniejszych, ponieważ będziesz w stanie obliczyć resztki dokładnie w razie potrzeby.
Jeśli resztki heurystyczne (patrz algorytm) są wystarczające, uważam, że twoją złożonością będzie , gdzie to rozmiar macierzy kwadratowej, a to ranga. Zauważ, że ranga jest funkcją przepisanej tolerancji obcięcia . Dokładne i gwarantowane granice błędów będą wymagały .N r ( ϵ ) r ϵ O ( N 2 r )O(Nr) N r(ϵ) r ϵ O(N2r)
źródło
W prostym przypadku, w którym macierz jest symetryczna z dodatnią wartością, oblicz jej powiedzmy 20 największych wartości własnych i sprawdź, czy są , lub porównaj normy. ARPACK jest do tego szybki; co ważniejsze, potrzebuje tylko funkcji . Tak więc dla ogólnego spójrz na wartości własne (jako LinOp, bez jego tworzenia).→ 0 x → AA →0 A A T Ax→Ax A ATA
scipy.sparse.linalg.svds robi to: LinOp Arpack, dla dowolnego rozmiaru:A(ATA)→ A
źródło