【发布时间】:2016-04-27 07:08:10
【问题描述】:
我正在使用这个函数 X = randsrc(250,600,[[-1,0,1];[0.5/ps,1-1/ps,0.5/ps]])) 和 ps=2373 它显示 250 *600 矩阵生成。它的条目只包含-1,0或1。而-1,0,1是根据概率分布0.5/ps,1-1/ps,0.5/ps随机选择的。
这样密度约为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/ps似乎比0.035少得多。我错过了什么? -
@beaker 对不起,你是对的。我已经更新了代码。
-
好吧,这更有意义。我唯一能想到的就是计算
1和-1值的数量,并使用randperm为它们选择随机位置。
标签: matlab