在matlab中有效地缩放稀疏矩阵的列

Efficiently scaling column of a sparse matrix in matlab

我有一个样本 X,它是一个稀疏矩阵 (~5%),现在尝试用一个因子缩放每一列(基本上是 tf-idf 归一化)。

我认为这是一项很容易完成的任务,但现在似乎并没有得到真正的支持。这是我使用的:

fac = log(size(X,1)./max(1,sum(X ~= 0)));
X = bsxfun(@times,X,fac); % this line gives an out of memory error

X 大约是 20,000x1,000,000,但只有约 5% 的特征是非零的,因此在内存方面应该没有任何问题(机器有 48 GB Ram,可以轻松处理具有相同数量的完整矩阵分配的元素)。

其实我觉得一定有一种简单的方法可以做到这一点,因为它是一种非常常见的操作,稀疏矩阵保存数据样本。

提前致谢

也许可以沿用这些思路:

  1. 找到非零值,并记下每个值的列索引:
  2. 将每个值除以列确定的fac的条目,并将结果放入X:

代码:

fac = log(size(X,1)./max(1,sum(X ~= 0)));   %// compute normalization vector
[~,  col, val] = find(X);                   %// step 1
X(X~=0) = val.*fac(col).';                 %'// step 2

是的线性代数!列缩放是对角矩阵的右乘:

X = X*diag(sparse(fac));