我有一个很大的scipy.sparse.csc_matrix
并希望将其标准化。即从每个元素中减去列均值并除以列标准差(std)i。
scipy.sparse.csc_matrix
有一个.mean()
,但有一种有效的方法来计算方差或标准吗?
答案 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在他的评论中指出的那样,标准化会在减法步骤中破坏稀疏性结构(引入大量非零元素),因此将矩阵保持为稀疏格式是没有用的。