Utilizzo di una matrice rada rispetto a un array numpy

Lug 20, 2021
admin

Il pacchetto di matrici rade scipy, e quelli simili in MATLAB, è stato basato su idee sviluppate da problemi di algebra lineare, come la risoluzione di grandi equazioni lineari rade (ad esempio, differenze finite e implementazioni di elementi finiti). Quindi cose come il prodotto di matrice (il prodotto dot per gli array di numpy) e i solutori di equazioni sono ben sviluppati.

La mia esperienza approssimativa è che un prodotto di matrice csr rada deve avere una sparsità dell’1% per essere più veloce dell’equivalente operazione dot densa – in altre parole, un valore non zero per ogni 99 zeri. (ma vedi i test qui sotto)

Ma la gente cerca anche di usare matrici sparse per risparmiare memoria. Ma tenete presente che una tale matrice deve memorizzare 3 matrici di valori (almeno nel formato coo). Quindi la sparsità deve essere inferiore a 1/3 per iniziare a risparmiare memoria. Ovviamente non risparmierete memoria se prima costruite la matrice densa, e create quella sparsa da quella.

Il pacchetto scipy implementa molti formati sparsi. Il formato coo è il più facile da capire e costruire. Costruiscine uno secondo la documentazione e guarda i suoi attributi .data, .row e .col (3 array di 1d).

csr e csc sono tipicamente costruiti dal formato coo, e comprimono un po’ i dati, rendendoli un po’ più difficili da capire. Ma hanno la maggior parte delle funzionalità matematiche.

È anche possibile indicizzare il formato csr, sebbene in generale questo sia più lento dell’equivalente caso di matrice/array densi. Anche altre operazioni come il cambio di valori (specialmente da 0 a non zero), la concatenazione, la crescita incrementale, sono più lente.

lil (liste di liste) è anche facile da capire, e migliore per la costruzione incrementale. dok è in realtà una sottoclasse di dizionario.

Un punto chiave è che una matrice sparsa è limitata a 2d, e in molti modi si comporta come la classe np.matrix (sebbene non sia una sottoclasse).

Una ricerca di altre domande usando scikit-learn e sparse potrebbe essere il modo migliore per trovare i pro e i contro dell’uso di queste matrici. Ho risposto a un certo numero di domande, ma conosco meglio il lato “sparso” che il lato “impara”. Penso che siano utili, ma ho la sensazione che l’adattamento non sia sempre il migliore. Qualsiasi personalizzazione è sul lato learn. Finora il pacchetto sparse non è stato ottimizzato per questa applicazione.

Ho appena provato alcuni test di prodotti di matrici, usando il metodo sparse.random per creare una matrice sparsa con una sparsità specificata. La moltiplicazione di matrici sparse ha funzionato meglio di quanto mi aspettassi.

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

È un problema di dimensioni; per matrici più piccole il metodo denso dot è più veloce

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

Ma confronta l’indicizzazione

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

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.