2015-09-24 2 views
1

Есть ли способ выделить память для 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)) 
+0

Нет, вы не можете выделить память для массивов numpy. Я подозреваю, что вы получаете ошибку памяти в функциях 'np.eye' или' np.diff'. Оба будут создавать массивы '(L, L)' shape - очень большие. Попробуйте те, у кого нет «разреженного» вызова. – hpaulj

+0

@hpaulj Вы правы. Ошибка возникает, когда функции np.diff передается большой массив np.eye: np.diff (np.eye (len (np.ones (50000)))) Я новичок в python. Кто-нибудь знает работу? –

+0

Обычно, когда люди делают большие разреженные матрицы, они пытаются построить их без предварительного создания эквивалентного плотного массива. Создание плотного удобного в небольших случаях, но поражает многие из преимуществ использования редких. – hpaulj

ответ

1

Попробуйте изменить

D = sparse.csc_matrix(np.diff(np.eye(L), 2)) 

в

diag = np.ones(L - 2) 
D = sparse.spdiags([diag, -2*diag, diag], [0, -1, -2], L, L-2) 

D будет разреженная матрица в DIA. Если выясняется, что, находясь в формате CSC важно, преобразовать его с помощью tocsc() метод:

D = sparse.spdiags([diag, -2*diag, diag], [0, -1, -2], L, L-2).tocsc() 

Следующий пример показывает, что старые и новые версии порождают ту же матрицу:

In [67]: from scipy import sparse 

In [68]: L = 8 

Оригинал:

In [69]: D = sparse.csc_matrix(np.diff(np.eye(L), 2)) 

In [70]: D.A 
Out[70]: 
array([[ 1., 0., 0., 0., 0., 0.], 
     [-2., 1., 0., 0., 0., 0.], 
     [ 1., -2., 1., 0., 0., 0.], 
     [ 0., 1., -2., 1., 0., 0.], 
     [ 0., 0., 1., -2., 1., 0.], 
     [ 0., 0., 0., 1., -2., 1.], 
     [ 0., 0., 0., 0., 1., -2.], 
     [ 0., 0., 0., 0., 0., 1.]]) 

Новая версия:

In [71]: diag = np.ones(L - 2) 

In [72]: D = sparse.spdiags([diag, -2*diag, diag], [0, -1, -2], L, L-2) 

In [73]: D.A 
Out[73]: 
array([[ 1., 0., 0., 0., 0., 0.], 
     [-2., 1., 0., 0., 0., 0.], 
     [ 1., -2., 1., 0., 0., 0.], 
     [ 0., 1., -2., 1., 0., 0.], 
     [ 0., 0., 1., -2., 1., 0.], 
     [ 0., 0., 0., 1., -2., 1.], 
     [ 0., 0., 0., 0., 1., -2.], 
     [ 0., 0., 0., 0., 0., 1.]]) 
+0

работает как шарм! –

Смежные вопросы