Utilizarea unei matrice rare față de matricea numpy
Pachetul de matrice rare scipy
și cele similare din MATLAB s-au bazat pe idei dezvoltate din problemele de algebră liniară, cum ar fi rezolvarea ecuațiilor liniare rare mari (de exemplu, implementări de diferențe finite și elemente finite). Astfel, lucruri precum produsul matricial (produsul dot
pentru matrici numpy) și rezolvatoarele de ecuații sunt bine dezvoltate.
Experiența mea aproximativă este că un produs matricial csr
rarefiat trebuie să aibă o raritate de 1% pentru a fi mai rapid decât operația dot
densă echivalentă – cu alte cuvinte, o valoare diferită de zero la fiecare 99 de zerouri. (dar vezi testele de mai jos)
Dar oamenii încearcă, de asemenea, să folosească matrici rarefiate pentru a economisi memorie. Dar țineți cont că o astfel de matrice trebuie să stocheze 3 matrici de valori (cel puțin în formatul coo
). Așadar, sparsity trebuie să fie mai mică de 1/3 pentru a începe să economisiți memorie. Evident, nu veți economisi memorie dacă mai întâi construiți matricea densă și apoi o creați pe cea rarefiată din aceasta.
Pachetul scipy
implementează multe formate rarefiate. Formatul coo
este cel mai ușor de înțeles și de construit. Construiți unul conform documentației și uitați-vă la atributele sale .data
, .row
și .col
(3 matrici de 1d).
csr
și csc
sunt construite de obicei din formatul coo
și comprimă puțin datele, ceea ce le face puțin mai greu de înțeles. Dar ele au cea mai mare parte a funcționalității matematice.
De asemenea, este posibil să se indexeze formatul csr
, deși, în general, acest lucru este mai lent decât cazul echivalent al matricelor/raialelor dense. Alte operații, cum ar fi schimbarea valorilor (în special de la 0 la non-zero), concatenarea, creșterea incrementală, sunt, de asemenea, mai lente.
lil
(liste de liste) este, de asemenea, ușor de înțeles și cel mai bine pentru construirea incrementală. dok
este de fapt o subclasă de dicționar.
Un punct cheie este că o matrice rarefiată este limitată la 2d și, în multe privințe, se comportă ca și clasa np.matrix
(deși nu este o subclasă).
O căutare a altor întrebări care utilizează scikit-learn
și sparse
ar putea fi cea mai bună modalitate de a găsi avantajele/neajunsurile utilizării acestor matrici. Am răspuns la o serie de întrebări, dar cunosc mai bine partea „sparse” decât partea „learn”. Cred că sunt utile, dar am sentimentul este că potrivirea nu este întotdeauna cea mai bună. Orice personalizare este pe partea learn
. Până în prezent, pachetul sparse
nu a fost optimizat pentru această aplicație.
Tocmai am încercat câteva teste de produs matricial, folosind metoda sparse.random
pentru a crea o matrice sparse cu o sparsitate specificată. Înmulțirea matricelor sparse s-a desfășurat mai bine decât mă așteptam.
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
Este o problemă de mărime; pentru matrici mai mici, metoda densă dot
este mai rapidă
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
Dar comparați indexarea
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
.