Utilizarea unei matrice rare față de matricea numpy

iul. 20, 2021
admin

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

.

Lasă un răspuns

Adresa ta de email nu va fi publicată.