2013-07-19 9 views
5

Sto usando Python con il modulo numpy, scipy e scikit-learn.Calcola la similarità della matrice sparsa

Vorrei classificare gli array in una matrice sparsa molto grande. (100.000 * 100.000)

I valori nella matrice sono uguali a 0 o 1. L'unica cosa che ho è l'indice del valore = 1.

a = [1,3,5,7,9] 
b = [2,4,6,8,10] 

che significa

a = [0,1,0,1,0,1,0,1,0,1,0] 
b = [0,0,1,0,1,0,1,0,1,0,1] 

Come posso modificare l'array di indici sull'array sparse in scipy?

Come classificare questi array rapidamente?

Grazie mille.

+0

questo mi domando, sarebbe possibile fare solo l'intera matrice non-sparse, dal momento che tutti i valori sono 0 o 1 comunque, quindi invece di 64bit per float o così, si usa solo un bit ciascuno? (So ​​che questo non risolve il tuo problema, ma la tua domanda mi ha fatto venire questa domanda) – usethedeathstar

+0

Che tipo di somiglianza vuoi calcolare? Perché hai bisogno della matrice sparsa, invece di usare solo gli indici? Che ne dici di qualcosa di semplice come len (set (a) e set (b))/float (len (a))? –

+0

In realtà, mi piacerebbe raggruppare questi array dalla similarità. Ad esempio [1,1,1,0] è più simile a [1,1,0,0] ma inverso con [0,0,0,1]. Poiché il numero di colonne e righe è grande. Non so se esiste un metodo in grado di farlo prima. –

risposta

3

Se si sceglie la scarsa coo_matrix è possibile crearlo passando gli indici come:

from scipy.sparse import coo_matrix 
import scipy 
nrows = 100000 
ncols = 100000 
row = scipy.array([1,3,5,7,9]) 
col = scipy.array([2,4,6,8,10]) 
values = scipy.ones(col.size) 
m = coo_matrix((values, (row,col)), shape=(nrows, ncols), dtype=float) 
+0

È possibile creare una matrice sparsa non quadrata con scipy? –

+0

Non ho mai provato ... Ora sono al cellulare ... puoi provarlo passando un'altra serie di indici e definendo la forma con un altro integer nella tupla ... –

+0

@Jimmy hai provato quello che è stato proposto qui ? Fammi sapere se hai bisogno di altro ... –