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

时间:2015-02-20 10:50:33

标签: matlab matrix out-of-memory normalization sparse-matrix

我有一个样本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并且可以轻松处理分配了相同元素数的完整矩阵)。

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

提前致谢

2 个答案:

答案 0 :(得分:2)

Yey for linear algebra!列缩放是对角矩阵的右乘:

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

答案 1 :(得分:0)

也许沿着这些方向使用:

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

    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