How to pick a value according to its probability

조회 수: 62 (최근 30일)
Steven
Steven 2011년 12월 7일
댓글: Real User 2023년 4월 28일
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
Walter Roberson
Walter Roberson 2016년 11월 3일
AB = [a,b];
AB( randi([1 2]) )
PANTHAGADA ANIL KUMAR
PANTHAGADA ANIL KUMAR 2020년 4월 16일
how to select an element with least probablility

댓글을 달려면 로그인하십시오.

채택된 답변

Sean de Wolski
Sean de Wolski 2011년 12월 7일
f = X(find(rand<cumsum(P),1,'first'))
  댓글 수: 1
Walter Roberson
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
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
krishna teja
krishna teja 2020년 4월 20일
searched a lot for this kind of function
Real User
Real User 2023년 4월 28일
randsample() seems to require Statistics and Machine Learning Toolbox

댓글을 달려면 로그인하십시오.


Steven Lord
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.

Mendi
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

카테고리

Help CenterFile Exchange에서 Logical에 대해 자세히 알아보기

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by