How to pick a value according to its probability
51 ビュー (過去 30 日間)
古いコメントを表示
Hi,
Let's say
P = [0.1 0.3 0.4 0.2]
X = [1 2 5 9]
where P(n) is the probability to select the X(n) element. I wish to make a function that select a "random" element of X according to its probability, like
f = myfun(P,X)
>> f = 2 (occurs around 30%)
thx a lot
4 件のコメント
採用された回答
Sean de Wolski
2011 年 12 月 7 日
f = X(find(rand<cumsum(P),1,'first'))
1 件のコメント
Walter Roberson
2011 年 12 月 7 日
The answers in the other thread took care in case cumsum(P) < 1 as can happen due to round-off error.
その他の回答 (3 件)
Jonathan
2018 年 9 月 3 日
編集済み: Jonathan
2018 年 9 月 3 日
The accepted answer is not doing any sanity check, and is sensitive to rounding errors. You should use randsample instead.
To sample n points from X, with replacement, and probabilities P:
randsample( X, n, true, P )
This can also be used with a custom RandStream (see documentation). Be aware that this function does NOT check for negative values in P; check manually if needed.
4 件のコメント
Steven Lord
2020 年 4 月 16 日
You can use discretize (which didn't exist when this question was asked originally) to do this. Generate uniform random numbers, bin them using bins whose widths are given by P, and for each bin return the corresponding element of X.
P = [0.1 0.3 0.4 0.2];
X = [1 2 5 9];
values = discretize(rand(1, 1e4), cumsum([0 P]), X);
histogram(values, 'Normalization', 'probability')
The probabilities shown in the histogram should agree pretty closely with the values in P.
0 件のコメント
Mendi
2021 年 7 月 9 日
The fastest one (100ns-200ns):
function [idx] = get_random_choice(p)
% Random choice with probability
% Example: get_random_choice([0.2,0.7,0.1])
N=length(p); idx=1; cump=0;
r=rand;
while(idx<N)
cump=cump+p(idx);
if(cump>r),break,else,idx=idx+1;end
end
end
0 件のコメント
参考
カテゴリ
Help Center および File Exchange で Logical についてさらに検索
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!