Разбить разреженную матрицу на куски без преобразования в плотную - PullRequest
2 голосов
/ 07 марта 2019

Я хочу разбить разреженную матрицу ( тип: scipy.sparse.csr.csr_matrix ) на N частей в правильном порядке и итеративно по ним, чтобы использовать их в качестве входных данных для прогнозирования классификации.

Однако, если я пытаюсь преобразовать разреженную матрицу в плотную матрицу с csr_matrix.toarray(), я получаю MemoryError.Размер преобразованного массива будет занимать 70 ГБ ОЗУ, протестировано с помощью метода в этом потоке ( Ошибка преобразования разреженной матрицы в массив с scipy.sparse.csc_matrix.toarray () )

Поэтому я не могу использовать numpy.array_split() для разделения массива, потому что он работает только на плотных матрицах.

Есть ли другой способ разбить / нарезать разреженную матрицу на N разреженных матриц?

Спасибо.


Дополнительное редактирование:

Так чтофрагментация происходит следующим образом с разреженным массивом X_test:

# X_test is a sparse matrix with feature vectors

chunk_results = []
X_dense = csr_matrix.toarray(X_test)
X_test_chunks = np.array_split(X_dense, 20)
for chunk in X_test_chunks:
    chunk_results.append(classifier.predict(chunk))
prediction = np.concatenate(chunk_results)

Вот пример преобразования небольшой разреженной матрицы в плотную:

# sparse
(0, 0)  -0.5
(0, 1)  3.8570557155110414
(0, 2)  -1.975755301731886
(1, 0)  -3.5
(1, 1)  6.54336961554629
(1, 2)  -3.311314222363026

# dense
[[-0.5         3.85705572 -1.9757553 ]
 [-3.5         6.54336962 -3.31131422]]

Каждый из этих двух внутренних массивов вплотная матрица - это Feature-Vector, представляющий один объект.По сути, предполагая, что мы попытаемся классифицировать их, выполнив технику разделения на фрагменты с преобразованием в этом примере, мы возьмем n = 2 и получим [-0,5 3,855572 -1,9757553] и [-3,5 6,54336962 -3,31131422] как два блока.В случае, если у нас будет матрица большего размера с большим количеством записей, будет несколько таких векторных массивов на чанк.


РЕШЕНИЕ

Я сделал обходной путьпутем деления числа строк разреженной матрицы на требуемое количество фрагментов и нарезки матрицы на фрагменты строк с этим числом, как предложил hpaulj:

Blockquote np.array_split выполняет нарезанное индексированиеплотный массив, [arr [i: j] для i, j в ....].Таким образом, вы можете сделать то же самое индексирование для матрицы CSR.Разреженная нарезка не так быстра, как плотная версия, но она работает (для правильного разреженного формата).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...