将自定义函数应用于sklearn中的稀疏矩阵

时间:2016-10-29 04:21:46

标签: python scipy scikit-learn linear-algebra sparse-matrix

我正致力于情感分析项目。我在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] 

对于b - > 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

如何将操作应用于这样的矩阵?

我知道我可以使用' .toarray'将其转换为常规矩阵。方法,但这是一个内存问题,矩阵是几个Gb。

1 个答案:

答案 0 :(得分:1)

稀疏csr矩阵有一个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函数和方法限制了稀疏矩阵的“知识”。熟悉稀疏的方法和功能。如果这些还不够,那么我们可以探索替代方案。