Random 有效使用倍频程';s randsample(带权重)在向量较大且大多数权重等于零的情况下

Random 有效使用倍频程';s randsample(带权重)在向量较大且大多数权重等于零的情况下,random,octave,Random,Octave,在一个即将到来的模拟项目中,我将遇到这样一种情况,我将不得不从一个巨大的向量中以加权的方式抽取一个随机元素。对于向量的大多数元素,指定的权重将为零。我还需要只画一个元素,所以替换或不替换函数是无关的 这个随机选取步骤将是我模拟的瓶颈,因此获得最佳效率和速度将是至关重要的 关于什么是最好的做法,有什么技巧吗?在我的项目中,是否有任何重要的节约 PS:randsample在大型向量上可靠吗?请查看统计软件包中的randsample.m的源代码。这实际上是一个非常简单的实现。它从权重向量创建归一化累积

在一个即将到来的模拟项目中,我将遇到这样一种情况,我将不得不从一个巨大的向量中以加权的方式抽取一个随机元素。对于向量的大多数元素,指定的权重将为零。我还需要只画一个元素,所以替换或不替换函数是无关的

这个随机选取步骤将是我模拟的瓶颈,因此获得最佳效率和速度将是至关重要的

关于什么是最好的做法,有什么技巧吗?在我的项目中,是否有任何重要的节约


PS:randsample在大型向量上可靠吗?

请查看统计软件包中的
randsample.m
的源代码。这实际上是一个非常简单的实现。它从权重向量创建归一化累积权重向量,然后通过标准反向采样对其进行有效采样

我不知道你所说的“巨大”是什么意思,但只要权重向量可以放在内存中,就没有理由不快

如果“巨大”是指内存中不适合的内容,则可以创建此函数的“巨大版本”,将累积权重向量拆分为保存在磁盘上的可预测“存储箱”,并仅从正确的存储箱执行反向采样


我要补充的唯一一件事是,考虑到实现,并且您只对一个绘图感兴趣,那么如果您明确地将“替换”指定为“true”,您可能会从速度中获益,因为默认值为“false”(即不替换),使用替换进行采样似乎可以避免许多不必要且昂贵的步骤(排列等)。

知道大多数权重等于零,您可以从倍频程源重写
randsample
的更快实现。在我的计时中,它比最初的实现快了
6X-7X

function y = randsample_fast(v, w)
    f = find(w);
    w = w(f);
    w = w / sum(w);
    w = [0 cumsum(w)];
    y = f(lookup (w , rand));
    %y = f(find (w <= rand, 1, "last"));
    y = v(y);
end
函数y=randsample\u fast(v,w)
f=查找(w);
w=w(f);
w=w/总和(w);
w=[0立方和(w)];
y=f(查找(w,rand));

%y=f(find(w)每个样本或每个向量绘制一个元素?更改/更改向量的频率如何?基本上,离散值有快速O(1)别名采样,但需要设置,因此如果经常更改向量,可能不值得。我将不得不更改向量几次(尽管每次迭代时对向量的更改为O(1)).我阅读了关于alias方法的wikipedia页面,在其最后一段中提到,它对“不平衡”概率不太有效。好吧,我唯一能想到的另一种可能性是根据概率对向量进行排序,并且只从顶部非零部分采样。权重向量是常数吗?