A ritka mátrix használata a numpy tömb ellen

júl 20, 2021
admin

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

Vélemény, hozzászólás?

Az e-mail-címet nem tesszük közzé.