14

我有一个大的scipy.sparse.csc_matrix,想把它标准化。即从每个元素中减去列平均值,然后除以列标准偏差 (std)i。

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

4

4 回答 4

14

您可以使用平均值自己计算方差,公式如下:

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

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

于 2012-08-29T09:31:42.037 回答
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())
于 2020-01-27T11:28:24.057 回答
0

我知道的最有效的方法是使用StandardScalarfrom scikit

from sklearn.preprocessing import StandardScaler


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

然后方差在属性中var_

X_var = scalar.var_

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

于 2021-02-09T07:52:25.390 回答
-3

有效的方法实际上是对整个矩阵进行致密化,然后以通常的方式对其进行标准化

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

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

于 2012-08-29T12:16:33.820 回答