2012-08-29 50 views
8

我有一个大的scipy.sparse.csc_matrix,并希望规范化它。那是从每个元素中减去列平均值并除以列标准差(std)i。如何计算Scipy中稀疏矩阵列的方差?

scipy.sparse.csc_matrix有一个.mean()但是有没有一种有效的方法来计算方差或std?

+5

我打算发布一些python代码来计算矢量化时尚方差,但是如果你“规范化它”,你就不会有任何零元素了,所以在我做之前,请告诉我们你没有搞乱无论如何你的稀疏结构。 – seberg

+0

这是塞巴斯蒂安非常好的一点,谢谢。我没有想到这一点。 – nickponline

回答

5

可以使用平均值,用以下formula自己计算方差:

E[X^2] - (E[X])^2 

E[X]代表的平均值。所以要计算E[X^2],您必须将csc_matrix平方,然后使用mean函数。要获得(E[X])^2,您只需将使用正常输入获得的mean函数的结果平方。

+2

为简单起见,矩阵:'c = matrix.copy(); c.data ** = 2'然后'c.mean(0); del c'(只能替换'.data')。但我坚持认为,运营机构听起来错误地表示要从所有元素中减去。 – seberg

+0

感谢您的回答和评论。 – nickponline

3

的有效途径实际上是致密整个矩阵,然后作为@Sebastian在他的评论指出以通常的方式与

X = X.toarray() 
X -= X.mean() 
X /= X.std() 

规范它,标准化破坏稀疏结构(引入大量的非零元素)在减法步骤中,所以没有必要将矩阵保持为稀疏格式。

+0

这其实并非如此。使用Sicco答案中的公式可以使用稀疏性来减少计算时间。 –