在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,可以轻松处理具有相同数量的完整矩阵分配的元素)。
其实我觉得一定有一种简单的方法可以做到这一点,因为它是一种非常常见的操作,稀疏矩阵保存数据样本。
提前致谢
也许可以沿用这些思路:
- 找到非零值,并记下每个值的列索引:
- 将每个值除以列确定的
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));
我有一个样本 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,可以轻松处理具有相同数量的完整矩阵分配的元素)。
其实我觉得一定有一种简单的方法可以做到这一点,因为它是一种非常常见的操作,稀疏矩阵保存数据样本。
提前致谢
也许可以沿用这些思路:
- 找到非零值,并记下每个值的列索引:
- 将每个值除以列确定的
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));