如何在csr_matrix中获取一列的平均值和标准差?

8

我有一个稀疏的 988x1 向量(在 csr_matrix 中的一个列)通过 scipy.sparse 创建。有没有一种方法可以得到它的平均值和标准差,而不必将稀疏矩阵转换为密集矩阵?

numpy.mean 似乎仅适用于密集向量。


将条目求和并除以m*n以计算平均值。假设这就是矩阵的平均值。我以前从未遇到过矩阵平均值。 - David Heffernan
嗨,大卫,我应该编辑一下我的问题,我想找到一个向量的均值和标准差,但是在其稀疏形式中,scipy 中有一个命令可以得到这两个值吗? - IssamLaradji
那么,我的评论中的定义准确吗?它是988个值的总和,除以988吗?如果你在处理列,为什么要使用CSR呢? - David Heffernan
@DavidHeffernan,因为我正在从语料库中提取TFIDF作为每个文档的特征向量,这往往是稀疏且非常大的:csr_matrix的维度约为988x40,000。您在计算平均值的过程中是正确的,但即使使用numpy.sum也无法处理稀疏向量,我必须使用嵌套循环来实现这一点,但我宁愿避免这样的循环!此外,我正在使用列来查找与目标最相关的特征,并通过将每个列与目标之间的相关函数应用于此来完成。 - IssamLaradji
1
在处理列时,使用csc会更快。您可以使用我在第一条评论中提供的sum函数。 - David Heffernan
@DavidHeffernan,谢谢老兄,它完美地工作了!我同意你使用csc的看法。干杯! - IssamLaradji
1个回答

9

如果您正在执行列切片操作,使用CSC存储矩阵可能比CSR更好。但这取决于您对矩阵的其他操作。

在CSC矩阵中计算列的平均值可以使用该矩阵的 mean() 函数。

要有效地计算标准差,需要稍微花费一点努力。首先,假设您像这样获取稀疏列:

col = A.getcol(colindex)

然后像这样计算方差:

N = col.shape[0]
sqr = col.copy() # take a copy of the col
sqr.data **= 2 # square the data, i.e. just the non-zero data
variance = sqr.sum()/N - col.mean()**2

10
一种替代方法(我自己的项目)是使用 scikit-learn 中的 StandardScaler,它对 CSR 和 CSC 矩阵有优化的均值+方差计算。请查看链接:http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html - Fred Foo
3
我收到了一个csr_matrix的错误信息:"无法对稀疏矩阵进行居中处理:请传递 'with_mean=False' 参数"。 - jul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接