我有一个大的scipy.sparse.csc_matrix
,想把它标准化。即从每个元素中减去列平均值,然后除以列标准偏差 (std)i。
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())
我知道的最有效的方法是使用StandardScalar
from scikit
:
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 在他的评论中指出的那样,标准化会在减法步骤中破坏稀疏结构(引入许多非零元素),因此将矩阵保持为稀疏格式是没有用的。