python - una - Rebanada de matriz dispersa utilizando la lista de int
recorrer matriz multidimensional python (1)
Creo que he recreado la indexación de fila
csr
con:
def extractor(indices, N):
indptr=np.arange(len(indices)+1)
data=np.ones(len(indices))
shape=(len(indices),N)
return sparse.csr_matrix((data,indices,indptr), shape=shape)
Pruebas en una
csr
que tenía dando vueltas:
In [185]: M
Out[185]:
<30x40 sparse matrix of type ''<class ''numpy.float64''>''
with 76 stored elements in Compressed Sparse Row format>
In [186]: indices=np.r_[0:20]
In [187]: M[indices,:]
Out[187]:
<20x40 sparse matrix of type ''<class ''numpy.float64''>''
with 57 stored elements in Compressed Sparse Row format>
In [188]: extractor(indices, M.shape[0])*M
Out[188]:
<20x40 sparse matrix of type ''<class ''numpy.float64''>''
with 57 stored elements in Compressed Sparse Row format>
Al igual que con otros métodos de
csr
, utiliza la multiplicación de matrices para producir el valor final.
En este caso con una matriz dispersa con 1 en filas seleccionadas.
El tiempo es en realidad un poco mejor.
In [189]: timeit M[indices,:]
1000 loops, best of 3: 515 µs per loop
In [190]: timeit extractor(indices, M.shape[0])*M
1000 loops, best of 3: 399 µs per loop
En su caso, la matriz extractora es (len (training_indices), 347) en forma, con solo valores
len(training_indices)
.
Entonces no es grande.
Pero si la
matrix
es tan grande (o al menos la segunda dimensión es tan grande) que produce algún error en las rutinas de multiplicación de la matriz, podría dar lugar a una falla de segmentación sin python / numpy atrapándola.
matrix.sum(axis=1)
.
Eso también usa una multiplicación matricial, aunque con una matriz densa de 1s.
O
sparse.eye(347)*M
, una multiplicación de matriz de tamaño similar?
Estoy escribiendo un algoritmo de aprendizaje automático en datos enormes y dispersos (mi matriz tiene forma (347, 5 416 812 801) pero muy dispersa, solo el 0.13% de los datos no es cero.
El tamaño de mi matriz dispersa es de 105 000 bytes (<1Mbytes) y es de tipo
csr
.
Estoy tratando de separar los conjuntos de tren / prueba eligiendo una lista de ejemplos de índices para cada uno. Entonces quiero dividir mi conjunto de datos en dos usando:
training_set = matrix[train_indices]
de forma
(len(training_indices), 5 416 812 801)
, aún escasa
testing_set = matrix[test_indices]
de forma
(347-len(training_indices), 5 416 812 801)
también escaso
Con
training_indices
y
testing_indices
dos
list
de
int
Pero
training_set = matrix[train_indices]
parece fallar y devuelve una
Segmentation fault (core dumped)
Puede que no sea un problema de memoria, ya que estoy ejecutando este código en un servidor con 64 Gbytes de RAM.
¿Alguna pista sobre cuál podría ser la causa?