2016-10-29 15 views
0

Я работаю над проектом анализа настроений. Я использую сумку слов на склеарне. Я хочу nomalize строки, как в:Применить пользовательские функции к разреженной матрице в sklearn

a = [1, 0, 1, 0, 0, 0, 0, 1, 0, 1] 
#a ->  4 non zero values 

нормированный вектор должен быть:

[0.25, 0.0, 0.25, 0.0, 0.0, 0.0, 0.0, 0.25, 0.0, 0.25] 

При Ь -> 8 не являющиеся нулями значения:

b = [1, 0, 1, 1, 0, 1, 1, 1, 1, 1] 

нормированный вектор должен быть :

[0.125, 0.0, 0.125, 0.125, 0.0, 0.125, 0.125, 0.125, 0.125, 0.125] 



class 'scipy.sparse.csr.csr_matrix 

    (0, 2111) 1 
    (0, 2812) 1 
    (0, 2848) 1 
    ...... 
    ...... 
    (0, 5745) 1 
    (0, 5823) 1 

Как можно применять o на такую ​​матрицу?

Я знаю, что могу преобразовать это в обычную матрицу с использованием метода «.toarray», но это вызывает проблему памяти, матрица - несколько Гб.

+1

Это не решение, а просто предложение преодолеть проблему памяти. Поскольку вы имеете дело с разреженной матрицей, вы можете сохранить матрицу в формате Matrix Market. Затем вы можете нормализовать каждое значение матрицы очень простым способом, как вы делаете для вектора. –

+1

Вы рассмотрели методы матрицы csr. Есть сумма, вероятно, средняя. Сделайте небольшой массив редким и экспериментируйте. – hpaulj

+0

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

ответ

1

разреженная матрица ксо имеет mean метод, разреженный версия np.mean:

In [2188]: a = np.array([1, 0, 1, 0, 0, 0, 0, 1, 0, 1]) 
In [2189]: a1 = sparse.csr_matrix(a) 
In [2190]: a1 
Out[2190]: 
<1x10 sparse matrix of type '<class 'numpy.int32'>' 
    with 4 stored elements in Compressed Sparse Row format> 

Плотные нормировки:

In [2191]: np.mean(a) 
Out[2191]: 0.40000000000000002 
In [2192]: a/np.mean(a) 
Out[2192]: array([ 2.5, 0. , 2.5, 0. , 0. , 0. , 0. , 2.5, 0. , 2.5]) 

разреженная нормализацию:

In [2193]: a1.mean() 
Out[2193]: 0.40000000000000002 
In [2194]: a1/a1.mean() 
Out[2194]: 
<1x10 sparse matrix of type '<class 'numpy.float64'>' 
    with 4 stored elements in Compressed Sparse Row format> 
In [2195]: (a1/a1.mean()).A 
Out[2195]: array([[ 2.5, 0. , 2.5, 0. , 0. , 0. , 0. , 2.5, 0. , 2.5]]) 

Как я только что объяснил, в вопросе о продукте с разреженной точкой, функция numpy s и методы ограничивают «знание» разреженных матриц. Ознакомьтесь с редкими методами и функциями. Если этого недостаточно, мы можем изучить альтернативы.