在Matlab中,如何快速生成“稀疏随机矩阵”,并将其快速乘以密集向量?

时间:2016-04-27 07:08:11

标签: matlab

我正在使用此函数X = randsrc(250,600,[[ - 1,0,1]; [0.5 / ps,1-1 / ps,0.5 / ps]]))ps = 2373它显示250 *生成600矩阵。它的条目只包含-1,0或1.根据0.5 / ps,1-1 / ps,0.5 / ps的概率分布随机选择-1,0,1。

因此密度约为0.00042。

以上X称为稀疏随机投影矩阵,请参阅https://web.stanford.edu/~hastie/Papers/Ping/KDD06_rp.pdf。它可用于将数据向量从600维压缩到250,并保证一些很好的几何属性。

问题是在Matlab中, randsrc 似乎非常慢(例如,与randn(250,600)相比)。那么,我怎样才能快速生成上述矩阵?

顺便说一句,我怎样才能快速计算X * y?其中y可能是一个密集的向量。

我的代码是:

ps=2373;
tic;
X = randsrc(250,600,[[-1,0,1];[0.5/ps,1-1/ps,0.5/ps]]));
toc

a = randn(600,1);
tic;
X*a;
toc

另外,我尝试过相同的Python函数http://scikit-learn.org/stable/modules/generated/sklearn.random_projection.SparseRandomProjection.html,它比Matlab快两倍。

1 个答案:

答案 0 :(得分:0)

您可以使用sprand生成稀疏结构,然后查找以提取非零元素的行和列。最终randsample将选择值-1,1,每个值的概率为50%:

ps=2373;
tic
[i,j,~] = find(sprand(250,600,1/ps))
X = sparse(i,j,randsample([-1,1],length(i),true))
toc

MATLAB在矩阵乘法运算中非常快,因此X * a非常快。

相关问题