unir una recorrer posiciones multidimensional matriz matrices lista guardar ejemplos declarar datos bidimensional arreglo python scipy segmentation-fault sparse-matrix

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?