繁体   English   中英

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

[英]How do I compute the variance of a column of a sparse matrix in Scipy?

我有一个很大的scipy.sparse.csc_matrix并且想对其进行规范化。 即从每个元素中减去列平均值并除以列标准偏差 (std)i。

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

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

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

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

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())

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

from sklearn.preprocessing import StandardScaler


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

然后方差在属性var_

X_var = scalar.var_

不过,奇怪的是,当我第一次使用pandas加密时(非常慢),我的回答相差了几个百分点。 不知道哪个更准确。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM