2013-03-14 16 views
7

Wiem, że istnieją pakiety w R do efektywnego przechowywania macierzy rzadkich. Czy istnieje również sposób na wydajne przechowywanie matrycy niskiej rangi? Na przykład:Przechowywanie dużej, ale niskiej rangi macierzy wydajnie

A <- matrix(rnorm(1e6), nrow=1e5, ncol=1e1) 
B <- A %*% t(A) 

Teraz B jest zbyt duża, aby zapisać w pamięci, ale ma niską rangę. Czy istnieje sposób na wydajne konstruowanie i przechowywanie w taki sposób, że niektóre podstawowe metody odczytu (rowSums, colSums, itp.) Są wykonywane w locie, w celu wymiany na cpu lub pamięć?

+0

Interesujące pytanie - jakie to ma zastosowania? (Gdzie zazwyczaj pojawiają się matryce niskopoziomowe?) –

+0

@DavidRobinson: Te macierze są używane, na przykład, jako przybliżenia dużych gęstych macierzy (zbyt dużych do obliczenia lub nawet do przechowywania), w niektórych [algorytmy optymalizacyjne] (http://en.wikipedia.org/wiki/Limited-memory_BFGS). –

+1

Jeśli chcesz przybliżyć B, możesz użyć przybliżenia niskowymiarowego, np. użyć SVD i zachować pierwsze n wymi SVD? Nie jestem pewien, czy to jest dokładnie to, czego chcesz, ale może być warte rozważenia. –

Odpowiedz

0

Oto inne podejście, chociaż brakuje mi doświadczenia, by wiedzieć, jak skuteczne byłoby to w przypadku dużych macierzy:

Jeśli pozycja jest niski, oznacza to, że matryca zawiera wiele nieistotnych linie, które są liniowe kombinacje innych. Jeśli macierz reprezentuje liniowy układ równań, można zaprojektować algorytm, który sukcesywnie usuwa te linie.

Aby sprawdzić, czy linia jest nieistotna, sprawdź, czy ranga macierzy bez tej linii jest wciąż taka sama. Aby obliczyć ranking macierzy, zobacz odpowiedź: this i that.

+1

To w zasadzie brzmi jak bardzo drogi sposób faktoringu :-) – Jeroen

+0

Niestety, ale strasznie zły pomysł, który działa tylko w przypadku prostym, z replikowanymi wierszami. W rzeczywistości TRYBALNE jest generowanie macierzy rangi 1, która NIE zawiera wierszy lub kolumn. Wybieraj losowe wektory rządkowe U i V, a następnie U '* V ma rangę 1. –

2

Twoje pytanie jest już odpowiedzią: Aby efektywnie przechowywać tak niską matrycę, tworzysz strukturę danych zawierającą oba te czynniki. Jeśli wymagane jest mnożenie w mnożniku wektorowym, można to zrobić od prawej do lewej za pomocą produktów macierzowo-wektorowych czynników.

Jedno zastosowanie tej strategii i struktury danych można znaleźć w implementacjach metod Broydena lub BFGS quasi-Newtona z ograniczoną pamięcią.

Powiązane problemy