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関数を作成する1つの方法は次のとおりです。

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 に答える