我有一个样本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并且可以轻松处理分配了相同元素数的完整矩阵)。
实际上我觉得必须有一个简单的方法来做到这一点,因为这是一个非常常见的操作,稀疏矩阵保存数据样本。
提前致谢
答案 0 :(得分:2)
Yey for linear algebra!列缩放是对角矩阵的右乘:
X = X*diag(sparse(fac));
答案 1 :(得分:0)
也许沿着这些方向使用:
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