如何计算Scipy中稀疏矩阵的列的方差?

时间:2012-08-29 01:08:34

标签: python numpy scipy

我有一个很大的scipy.sparse.csc_matrix并希望将其标准化。即从每个元素中减去列均值并除以列标准差(std)i。

scipy.sparse.csc_matrix有一个.mean(),但有一种有效的方法来计算方差或标准吗?

4 个答案:

答案 0 :(得分:12)

您可以使用平均值自行计算方差,使用以下formula

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

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

答案 1 :(得分:0)

Sicco有更好的答案。

但是,另一种方法是将稀疏矩阵一次转换为一个密集的numpy数组(与一次转换整个矩阵相比,以保持较低的内存需求):

# mat is the sparse matrix
# Get the number of columns
cols = mat.shape[1]
arr = np.empty(shape=cols)
for i in range(cols):
    arr[i] = np.var(mat[:, i].toarray())

答案 2 :(得分:0)

我所知道的最有效的方法是使用 StandardScalar 中的 scikit

from sklearn.preprocessing import StandardScaler


scalar = StandardScaler(with_mean=False)
scalar.fit(X)

那么方差在属性 var_ 中:

X_var = scalar.var_

但奇怪的是,当我第一次使用 pandas(非常慢)进行增密时,我的答案偏离了几个百分点。我不知道哪个更准确。

答案 3 :(得分:-1)

有效的方法实际上是将整个矩阵密集化,然后用通常的方式将其标准化

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

正如@Sebastian在他的评论中指出的那样,标准化会在减法步骤中破坏稀疏性结构(引入大量非零元素),因此将矩阵保持为稀疏格式是没有用的。