我正在使用此函数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快两倍。
答案 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非常快。