2015-10-19 3 views
2

У меня есть набор шариков в сумке (A/B/C/D), каждый с назначенным весом ([0.1 0.3 0.1 0.2]), который описывает относительную вероятность того, что каждый шар будет выбран над другим. Затем я хочу выбрать n количество мячей за раунд последовательно, запишите выбранные шары и верните их обратно в сумку, перезагрузив систему для следующей итерации.Вычисление вероятности того, что какой-либо данный объект будет выбран

Я заинтересован в вычислении общей вероятности получения любого заданного шара.

В упрощенном примере, если п = 1

Бал Б - 0.3/(0.1+0.3+0.1+0.2) = 0.4286 = шар В будет выбран в 42,86% от патронов.

Усложнение возникает при n => 1.

Например, если n = 2 - какова вероятность того, что Ball B будет одним из шаров, выбранных в любом заданном раунде?

Есть ли способ, которым MATLAB может рассчитать такую ​​информацию?

+0

Шары выбраны с заменой или без нее? Может ли 'n' превышать количество шаров? –

+0

Нет n не может превышать общее количество шаров. – AnnaSchumann

+0

И они отбираются без замены, не так ли? Как только вы возьмете мяч, у вас есть только три шарика для отбора из –

ответ

2

Пример случайного приближения:

1/Нормализовать свою гирю вектор так, что он содержит вероятности, как заявил Маркус Мюллер в своем ответе

probabilities=weights/sum(weights); 

2/Теперь давайте предположим, что мы имеем P шаров индексы с целыми числами {1,2,...,P}, и мы хотим нарисовать n из них за эксперимент. Нам нужно получить случайные образцы без замены из набора {1,2,...,P} относительно вектора вероятности probabilities.

s1=datasample(1:P,n,'replace',false,'weights',probabilities) 

Это должно дать вам образец, соответствующий вашим вероятностям. Тем не менее, вам еще нужно сделать повторение процесса достаточно большим количеством раз и подсчитать, сколько раз каждый мяч находится в вашем образце, чтобы рассчитать ваши вероятности. (Т.е.

P(ballA)=Number of times ballA was in sample/Total Number of samples 

Что-то вдоль линий:

TotalSamples=1000; 
Res=zeros(TotalSamples,n); 

for ii=1:TotalSamples 

    Res(ii,:)=datasample(1:P,n,'replace',false,'weights',probabilities); 


end 

%% Prob ball A : 

PA=sum(sum(Res==1))/TotalSamples; 

%% Vector containing all probs : 

FinalProbs=zeros(P,1); 

for jj=1:P 

FinalProbs(jj)=sum(sum(Res==jj))/TotalSamples; 

end 

Запуск этого на вас, например, я получить окончательные вероятности:

%% TotalSamples=1000 
FinalProbs = 

0.3180 
0.7310 
0.3250 
0.6260 

%% TotalSamples=100000 

FinalProbs = 

0.3303 
0.7440 
0.3294 
0.5964 

Обратите внимание, что это совершенно нормально, что вашей суммы вероятностей до более чем 1, потому что события не пересекаются (вы можете нарисовать разные шары на образец, если n> 1 ..)

+0

Я изначально пробовал этот метод, однако 'datasample' просто возвращает входные веса - у меня создалось впечатление, что при n> 1 это не должно быть так. – AnnaSchumann

+0

Вы запустили 'datasample' со всеми аргументами, которые я вам дал? – BillBokeey

+0

Это был бы мой подход. Вы также можете использовать 'randsample' instrad' datasample' –

0

Эта информация не требуется вычислять, она уже существует в виде весов. Эти веса просто пропорциональны вероятностям, и на самом деле у вас есть вероятности, если вы просто сделали это так, чтобы sum(weights)==1; следовательно,

probabilities = weights ./ sum(weights); 

- ваше решение.

+0

Я не думаю, что это действительно отвечает на вопрос –