A ritka mátrix használata a numpy tömb ellen
A scipy
ritka mátrix csomag, és a hasonlóak a MATLAB-ban, a lineáris algebrai problémákból kifejlesztett ötleteken alapulnak, mint például a nagy ritka lineáris egyenletek megoldása (pl. véges differenciák és véges elemek implementációi). Így az olyan dolgok, mint a mátrixszorzat (a dot
termék a numpy tömbökhöz) és az egyenletmegoldók jól kidolgozottak.
Az én durva tapasztalatom az, hogy egy ritka csr
mátrixszorzatnak 1%-os ritkasággal kell rendelkeznie ahhoz, hogy gyorsabb legyen, mint az egyenértékű sűrű dot
művelet – más szóval, minden 99 nullára egy nem nulla érték jut. (de lásd a teszteket alább)
Az emberek azonban memóriamegtakarítás céljából is próbálnak ritkás mátrixokat használni. De ne feledjük, hogy egy ilyen mátrixnak 3 értéktömböt kell tárolnia (legalábbis coo
formátumban). Tehát a ritkaságnak 1/3-nál kisebbnek kell lennie ahhoz, hogy elkezdjünk memóriát megtakarítani. Nyilvánvalóan nem fogsz memóriát megtakarítani, ha először felépíted a sűrű tömböt, és abból hozod létre a ritkát.
A scipy
csomag számos ritkás formátumot valósít meg. A coo
formátumot a legkönnyebb megérteni és felépíteni. Építsünk egyet a dokumentáció szerint, és nézzük meg a .data
, .row
és .col
attribútumait (3 1d tömb).
csr
és csc
jellemzően a coo
formátumból épülnek fel, és egy kicsit tömörítik az adatokat, így kicsit nehezebb őket megérteni. De a legtöbb matematikai funkcionalitással rendelkeznek.
A csr
formátumot is lehet indexelni, bár ez általában lassabb, mint az egyenértékű sűrű mátrix/mátrix esete. Más műveletek, mint az értékek megváltoztatása (különösen 0-ról nem nullára), az összekapcsolás, az inkrementális növekedés, szintén lassabbak.
lil
(listák listái) szintén könnyen érthető, és inkrementális építésre a legjobb. A dok
tulajdonképpen egy szótár alosztály.
A legfontosabb szempont, hogy a ritka mátrix 2d-re korlátozódik, és sok szempontból úgy viselkedik, mint a np.matrix
osztály (bár ez nem alosztály).
Az scikit-learn
és sparse
használatával kapcsolatos más kérdéseket keresve talán a legjobb módja annak, hogy megtaláljuk a mátrixok használatának előnyeit/ellenérveit. Számos kérdésre válaszoltam már, de a ‘sparse’ oldalt jobban ismerem, mint a ‘learn’ oldalt. Szerintem hasznosak, de az az érzésem, hogy az illeszkedés nem mindig a legjobb. Minden testreszabás a learn
oldalon van. Eddig a sparse
csomagot nem optimalizálták erre az alkalmazásra.
Most próbáltam ki néhány mátrixtermék tesztet, a sparse.random
módszerrel egy megadott ritkaságú ritka mátrix létrehozására. A ritkamátrix szorzás jobban teljesített, mint vártam.
In : M=sparse.random(1000,1000,.5)In : timeit M1=M*M1 loops, best of 3: 2.78 s per loopIn : timeit Ma=M.toarray(); M2=Ma.dot(Ma)1 loops, best of 3: 4.28 s per loop
Ez méretprobléma; kisebb mátrix esetén a sűrű dot
gyorsabb
In : M=sparse.random(100,100,.5)In : timeit M1=M*M100 loops, best of 3: 3.24 ms per loopIn : timeit Ma=M.toarray(); M2=Ma.dot(Ma)1000 loops, best of 3: 1.44 ms per loop
De hasonlítsuk össze az indexelést
In : timeit M.tocsr()10 loops, best of 3: 86.4 ms per loopIn : timeit Ma1000000 loops, best of 3: 318 ns per loopIn : timeit Ma=M.toarray();Ma10 loops, best of 3: 23.6 ms per loop