Есть ли способ выделить память для scipy разреженных матричных функций для обработки больших наборов данных?выделить память в python для больших операций с матрицей scipy.sparse
В частности, я попытка использовать Асимметричные наименьших квадратов сглаживания (в переводе на Python here и оригинального here), чтобы выполнить коррекцию базовой линии на большом наборе данных Масс-спектр (длина ~ 60000).
Функция (см. Ниже) использует операции матрицы scipy.sparse.
def baseline_als(y, lam, p, niter):
L = len(y)
D = sparse.csc_matrix(np.diff(np.eye(L), 2))
w = np.ones(L)
for i in xrange(niter):
W = sparse.spdiags(w, 0, L, L)
Z = W + lam * D.dot(D.transpose())
z = spsolve(Z, w*y)
w = p * (y > z) + (1-p) * (y < z)
return z
У меня нет никаких проблем, когда я прохожу наборы данных, которые являются 10000 или меньше в длину:
baseline_als(np.ones(10000),100,0.1,10)
Но при прохождении больших наборов данных, например,
baseline_als(np.ones(50000), 100, 0.1, 10)
Я получаю MemoryError, для линии
D = sparse.csc_matrix(np.diff(np.eye(L), 2))
Нет, вы не можете выделить память для массивов numpy. Я подозреваю, что вы получаете ошибку памяти в функциях 'np.eye' или' np.diff'. Оба будут создавать массивы '(L, L)' shape - очень большие. Попробуйте те, у кого нет «разреженного» вызова. – hpaulj
@hpaulj Вы правы. Ошибка возникает, когда функции np.diff передается большой массив np.eye: np.diff (np.eye (len (np.ones (50000)))) Я новичок в python. Кто-нибудь знает работу? –
Обычно, когда люди делают большие разреженные матрицы, они пытаются построить их без предварительного создания эквивалентного плотного массива. Создание плотного удобного в небольших случаях, но поражает многие из преимуществ использования редких. – hpaulj