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

Posted

技术标签:

【中文标题】将自定义函数应用于 sklearn 中的稀疏矩阵【英文标题】:Apply custom functions to sparse matrix in sklearn 【发布时间】:2017-03-11 23:46:38 【问题描述】:

我正在做一个情绪分析项目。我在 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。

【问题讨论】:

这不是一个解决方案,而只是一个解决内存问题的建议。由于您正在处理稀疏矩阵,因此您可以将矩阵存储为 Matrix Market 格式。然后,您可以像处理向量一样以非常简单的方式对矩阵的每个值进行归一化。 你看过csr矩阵的方法吗?有一个总和,可能是一个平均值。使小数组稀疏并进行实验。 我应该添加 sklearn 也有一些自定义稀疏函数 - 以加快该包中的常见任务。我查看了他们的代码以解决其他问题,但没有注意它们的记录位置或方式。 【参考方案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 函数和方法对稀疏矩阵的“知识”有限。熟悉稀疏方法和函数。如果这些还不够,那么我们可以探索替代方案。

【讨论】:

以上是关于将自定义函数应用于 sklearn 中的稀疏矩阵的主要内容,如果未能解决你的问题,请参考以下文章

使用 sklearn 对大型稀疏矩阵执行 PCA

将 sklearn LogisticRegression 系数链接到稀疏矩阵中的项,并获得统计显着性 / C.I

sklearn svm中的稀疏预计算Gram矩阵?

如何将自定义函数应用于每行的熊猫数据框[重复]

将自定义函数应用于 spark 数据框组

无法使用 sklearn 中的稀疏矩阵计算 silhouette_score [关闭]