在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约为20000x1000000,但只有约5%的特征是非零的,因此在内存方面不应该有任何问题(该机器有48 GB Ram,可以轻松处理具有相同元素数的完整矩阵)。

事实上,我觉得必须有一种简单的方法来做到这一点,因为这是一种非常常见的稀疏矩阵保存数据样本的操作。

提前感谢

线性代数的Yey!列缩放是对角矩阵的右乘积:
X = X*diag(sparse(fac));

也许可以使用以下内容:

  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

最新更新