How to pick a value according to its probability
54 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Steven
el 7 de Dic. de 2011
Comentada: Real User
el 28 de Abr. de 2023
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 comentarios
Respuesta aceptada
Sean de Wolski
el 7 de Dic. de 2011
f = X(find(rand<cumsum(P),1,'first'))
1 comentario
Walter Roberson
el 7 de Dic. de 2011
The answers in the other thread took care in case cumsum(P) < 1 as can happen due to round-off error.
Más respuestas (3)
Jonathan
el 3 de Sept. de 2018
Editada: Jonathan
el 3 de Sept. de 2018
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 comentarios
Real User
el 28 de Abr. de 2023
randsample() seems to require Statistics and Machine Learning Toolbox
Steven Lord
el 16 de Abr. de 2020
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 comentarios
Mendi
el 9 de Jul. de 2021
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 comentarios
Ver también
Categorías
Más información sobre Logical en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!