1

因此,让我首先说我没有 Matlab 的统计工具箱,所以我试图找到一种方法来解决这个问题。无论如何,我想要做的是复制 Rsample函数。例如,在 R

> x = sample(1:5,20,replace=T,prob=c(.1,.1,.1,.1,.6))
> x
 [1] 5 5 5 4 5 2 5 5 1 5 5 5 5 5 5 3 5 1 5 5

所以我用替换对整数 1,2,3,4,5 进行采样。但此外,我以一定的比例对每个整数进行采样,即整数 5 应该在大约 60% 的时间内被采样。

所以我想找到解决方案的问题是如何在 Matlab 中实现这一点?

4

3 回答 3

4

以下是如何执行带替换的加权采样(Matlabrandsample不支持,顺便说一句);

function r = sample(pop,n,weights)
%# each weight creates a "bin" of defined size. If the value of a random number
%# falls into the bin, we pick the value

%# turn weights into a normed cumulative sum
csWeights = cumsum(weights(:))/sum(weights);
csWeights = [0;csWeights(1:end-1)];

%# for each value: pick a random number, check against weights
idx = sum(bsxfun(@ge,rand(1,n),csWeights),1);

r = pop(idx);
于 2013-02-11T16:33:51.257 回答
3

未加权的情况很容易使用randi

function r = sample(pop, n)

imax = length(pop);
index = randi(imax, n, 1);
r = pop(index);

end

在加权的情况下,这样的事情应该可以解决问题:

function r = sample(pop, n, prob)

cumprob = cumsum(prob);
r = zeros(1, n);
for i = 1:n
  index = find(rand < cumprob, 1, 'last');
  r(i) = pop(index);
end

end
于 2013-02-11T16:27:00.583 回答
1

这是制作自己的sample功能的一种方法:

function x = sample(v, n, p)

pc = cumsum(p) / sum(p);
r = rand(1,n);
x = zeros(1,n);
for i = length(pc):-1:1
    x(r<pc(i)) = v(i);
end

它并不完全有效,但它可以满足您的需求。像这样称呼它:

v = [1 2 3 4 5];
p = [.1 .1 .1 .1 .6];
n = 20;
x = sample(v,n,p);
于 2013-02-11T16:37:01.107 回答