Разреженная матричная нарезка с использованием списка int
Я пишу алгоритм машинного обучения для огромных и разреженных данных (моя матрица имеет форму (347, 5 416 812 801), но очень разреженную, только 0,13% данных не равно нулю.
Размер моей разреженной матрицы составляет 105 000 байт (<1 МБ) и имеет csr
тип.
Я пытаюсь разделить обучающие / тестовые наборы, выбрав список примеров индексов для каждого. Поэтому я хочу разделить мой набор данных на две части, используя:
training_set = matrix[train_indices]
формы (len(training_indices), 5 416 812 801)
все еще редкий
testing_set = matrix[test_indices]
формы (347-len(training_indices), 5 416 812 801)
также редкий
С training_indices
а также testing_indices
два list
из int
Но training_set = matrix[train_indices]
кажется, не удается и вернуть Segmentation fault (core dumped)
Это может быть не проблема памяти, так как я запускаю этот код на сервере с 64 Гбайт оперативной памяти.
Любая подсказка о том, что может быть причиной?
1 ответ
Я думаю, что я воссоздал csr
индексирование строк с помощью:
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)
Тестирование на csr
Я слонялся вокруг:
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>
Как и с рядом других csr
методы, он использует матричное умножение для получения окончательного значения. В этом случае с разреженной матрицей с 1 в выбранных строках. Время на самом деле немного лучше.
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
В вашем случае матрица экстрактора имеет форму (len(training_indices),347), только len(training_indices)
ценности. Так что это не большой.
Но если matrix
Он настолько велик (или, по крайней мере, 2-е измерение настолько велико), что вызывает некоторую ошибку в процедурах умножения матриц, что может привести к ошибке сегментации без перехвата python / numpy.
Есть ли matrix.sum(axis=1)
Работа. Это также использует умножение матриц, хотя с плотной матрицей 1 с. Или же sparse.eye(347)*M
, аналогичный размер матрицы умножения?