Pracuję z bardzo dużym problemem mnożenia macierzy rzadkich (matmul). Jako przykład załóżmy:mnożenie macierzy w rozmiarze trójkątnym/rzadkim?
A jest macierzą binarną (75 x 200 000). Jest rzadki, więc używam csc do przechowywania. Trzeba wykonać następujące matmul operacji:
B = A.transpose() * a
Wyjście będzie rzadki i symetrycznych macierzy o rozmiarze 200Kx200K.
Niestety, B będzie sposób do dużych przechowywać w pamięci RAM (lub „w rdzeniu”) na moim laptopie. Z drugiej strony, mam szczęście, ponieważ istnieją pewne właściwości B, które powinny rozwiązać ten problem.
Ponieważ B będzie symetryczne wzdłuż przekątnej i rzadkie, mógłbym użyć trójkątnej matrycy (górna/dolna) do przechowywania wyników operacji matmul, a rzadki format przechowywania matrycy może dodatkowo zmniejszyć rozmiar.
Moje pytanie brzmi ... potrafię zmylić lub scipy powiedzieć z wyprzedzeniem, jakie będą wymagania dotyczące pamięci wyjściowej, aby móc wybrać rozwiązanie pamięci masowej za pomocą numpy i uniknąć "matrycy jest zbyt duża" błąd runtime po kilku minutach (godzinach) obliczeń?
Czy można zwiększyć wymagania dotyczące pamięci masowej macierzy poprzez analizę zawartości dwóch macierzy wejściowych przy użyciu algorytmu obliczania przybliżonego?
Jeśli nie, szukam do brutalnej siły rozwiązania. Coś z udziałem Mapa/zmniejszenia, out-of-core przechowywania lub roztworem matmul podziałowych (algorytm strassens) z poniższych linków:
Kilka Mapa/Reduce rozwiązań podziałowe problemowych
- http://www.norstad.org/matrix-multiply/index.html
- http://bpgergo.blogspot.com/2011/08/matrix-multiplication-in-python.html
poza wewnątrzrdzeniowego roztwór (PyTables) składowanie
matmul rozwiązanie Dzielnica:
- https://en.wikipedia.org/wiki/Strassen_algorithm
- http://facultyfp.salisbury.edu/taanastasio/COSC490/Fall03/Lectures/FoxMM/example.pdf
- http://eli.thegreenplace.net/2012/01/16/python-parallelizing-cpu-bound-tasks-with-multiprocessing/
Dzięki z góry za wszelkie zalecenia, komentarze lub wskazówek!
przeprosiny Opóźnienie. dziękuję za pomoc! Obawiałem się, że wyrażenie "wymagania dotyczące przechowywania" jest niejasne. kod szacunkowy, który wysłałeś, był * dokładnie * tym, co miałem nadzieję się nauczyć.czy twoja metoda jest inspirowana niektórymi analitycznymi kombinatorycznymi/asymptotycznymi działaniami, które robiła sedgewick i flajolet (w odniesieniu do przybliżonych liczb)? Referencje: https://en.wikipedia.org/wiki/Analytic_combinatorics http://algo.inria.fr/flajolet/Publications/AnaCombi/ https://en.wikipedia.org/wiki/Asymptotic_theory https: //en.wikipedia.org/wiki/Approximate_counting_algorithm –
@ct. Niestety, mieszkam w kraju daleko, daleko od akademii, więc nigdy nie słyszałem o żadnym z rzeczy, które łączyłeś. Moją inspiracją był po prostu opis [CSR] (http://en.wikipedia.org/wiki/Sparse_matrix#Compressed_sparse_row_.28CSR_or_CRS.29) i [CSC] (http://en.wikipedia.org/wiki/Sparse_matrix # Compressed_sparse_column_.28CSC_or_CCS.29) formatów. – Jaime