【问题标题】:How do I compute the variance of a column of a sparse matrix in Scipy?如何计算 Scipy 中稀疏矩阵列的方差?
【发布时间】:2012-08-29 01:08:33
【问题描述】:

我有一个大的scipy.sparse.csc_matrix 并希望对其进行规范化。即从每个元素中减去列均值,然后除以列标准差 (std)i。

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

【问题讨论】:

  • 我打算发布一些 python 代码来以矢量化方式计算方差,但是如果你“标准化”你将不会留下任何零元素,所以在我这样做之前,请告诉我们无论如何,你并没有弄乱你的稀疏结构。
  • 塞巴斯蒂安说得非常好,谢谢。我没想到。

标签: python numpy scipy


【解决方案1】:

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

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

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

【讨论】:

  • 对矩阵求平方,为简单起见:c = matrix.copy(); c.data **= 2 然后c.mean(0); del c(只能替换.data)。但我坚持认为 OP 从所有元素中减去听起来是错误的。
  • 感谢您的回答和cmets。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    from sklearn.preprocessing import StandardScaler
    
    
    scalar = StandardScaler(with_mean=False)
    scalar.fit(X)
    

    那么方差在属性var_中:

    X_var = scalar.var_
    

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

    【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

    • 这不是真的。使用 Sicco 答案中的公式可以使用稀疏性来减少计算时间。
    • 对于非常大的矩阵,这个答案甚至不适合内存,而另一个答案运行得非常流畅和快速。
    猜你喜欢
    • 2014-10-11
    • 2018-06-04
    • 1970-01-01
    • 2012-10-22
    • 2013-10-10
    • 2017-10-23
    • 2017-10-21
    • 1970-01-01
    • 2017-01-19
    相关资源
    最近更新 更多