【问题标题】:In Matlab, how to fast generate 'sparse random matrix', and fast multiply it with a dense vector?在 Matlab 中,如何快速生成“稀疏随机矩阵”,并快速将其与密集向量相乘?
【发布时间】: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


【解决方案1】:

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

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 非常快。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-28
    • 2015-04-07
    • 1970-01-01
    • 2021-12-18
    • 2018-09-26
    • 2021-02-21
    • 1970-01-01
    • 2014-10-30
    相关资源
    最近更新 更多