Haaran matriisin käyttö vs. numpy-matriisi
scipy
harvan matriisin paketti ja vastaavat MATLABissa perustuvat ideoihin, jotka on kehitetty lineaarialgebran ongelmista, kuten suurten harvalukuisten lineaaristen yhtälöiden ratkaisemisesta (esim. äärellinen differenssi- ja äärellisten elementtien toteutukset). Niinpä sellaiset asiat kuin matriisituotos (numpy-matriisien dot
-tuote) ja yhtälönratkaisijat ovat hyvin kehittyneitä.
Karkea kokemukseni on, että harvan csr
-matriisituotoksen on oltava 1 % harvinaisempi, jotta se olisi nopeampi kuin vastaava tiheä dot
-operaatio – toisin sanoen yksi nollasta poikkeava arvo 99 nollaa kohti. (mutta katso testit alla)
Mutta ihmiset yrittävät myös käyttää harvoja matriiseja säästääkseen muistia. Mutta pitää muistaa, että tällainen matriisi joutuu tallentamaan 3 arvomäärää (ainakin coo
-muodossa). Harvennuksen on siis oltava alle 1/3, jotta muistia aletaan säästää. Ilmeisesti et säästä muistia, jos ensin rakennat tiheän matriisin ja luot siitä harvan matriisin.
scipy
-paketti toteuttaa monia harvaformaatteja. coo
-muoto on helpoin ymmärtää ja rakentaa. Rakenna yksi dokumentaation mukaan ja katso sen .data
-, .row
– ja .col
-attribuutteja (3 1d-määrät).
csr
ja csc
rakennetaan tyypillisesti coo
-formaatista, ja ne pakkaavat dataa hieman, mikä tekee niistä hieman vaikeammin ymmärrettäviä. Niissä on kuitenkin suurin osa matemaattisesta toiminnallisuudesta.
On myös mahdollista indeksoida csr
-muodossa, vaikka se on yleensä hitaampaa kuin vastaava tiheän matriisin/matriisin tapaus. Muut operaatiot, kuten arvojen muuttaminen (erityisesti 0:sta nollasta poikkeavaksi), ketjuttaminen, inkrementaalinen kasvattaminen, ovat myös hitaampia.
lil
(listojen listat) on myös helppotajuinen, ja paras inkrementaaliseen rakentamiseen. dok
on itse asiassa sanakirjan aliluokka.
Keskeistä on, että harva matriisi rajoittuu 2d:hen, ja käyttäytyy monella tapaa kuin np.matrix
-luokka (vaikkei se olekaan aliluokka).
Etsimällä muita kysymyksiä, joissa käytetään scikit-learn
:tä ja sparse
:aa, saattaisi löytyä paras tapa löytää plussat/miinukset näiden matriisien käytöstä. Olen vastannut useisiin kysymyksiin, mutta tunnen ’harvan’ puolen paremmin kuin ’oppivan’ puolen. Mielestäni ne ovat hyödyllisiä, mutta minusta tuntuu, että sovitus ei aina ole paras mahdollinen. Kaikki mukautukset ovat learn
-puolella. Toistaiseksi sparse
-pakettia ei ole optimoitu tähän sovellukseen.
Kokeilin juuri joitain matriisituotetestejä käyttäen sparse.random
-menetelmää luomaan harvan matriisin, jolla on määritetty harvuus. Harvan matriisin kertominen toimi paremmin kuin odotin.
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
Se on kokokysymys; pienemmille matriiseille tiheä dot
on nopeampi
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
Mutta vertaa indeksointia
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