Разреженная матричная нарезка с использованием списка 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, аналогичный размер матрицы умножения?

Другие вопросы по тегам