Powiedzmy, że rzuciłeś monetą 10 razy i nazwałeś to 1 „zdarzeniem”. Jeśli uruchomisz 1 000 000 takich „zdarzeń”, jaki jest odsetek zdarzeń, które mają głowy pomiędzy 0,4 a 0,6? Prawdopodobieństwo dwumianowe sugerowałoby, że będzie to około 0,65, ale mój kod Mathematica mówi mi o 0,24
Oto moja składnia:
In[2]:= X:= RandomInteger[];
In[3]:= experiment[n_]:= Apply[Plus, Table[X, {n}]]/n;
In[4]:= trialheadcount[n_]:= .4 < Apply[Plus, Table[X, {n}]]/n < .6
In[5]:= sample=Table[trialheadcount[10], {1000000}]
In[6]:= Count[sample2,True];
Out[6]:= 245682
Gdzie jest nieszczęście?
computational-statistics
mathematica
Tim McKnight
źródło
źródło
Odpowiedzi:
Nieszczęście polega na użyciu ściśle mniej niż.
Przy dziesięciu rzutach jedynym sposobem na uzyskanie wyniku w proporcji głów dokładnie od 0,4 do 0,6 jest uzyskanie dokładnie 5 głów. Ma to prawdopodobieństwo około 0,246 ( ), co dotyczy twoich symulacji (poprawnie ) dać.(105)(12)10≈0.246
Jeśli włączysz 0,4 i 0,6 w swoich limitach (tj. 4, 5 lub 6 głów w 10 rzutach), prawdopodobieństwo ma wynik około 0,656, tak jak się spodziewałeś.
Twoja pierwsza myśl nie powinna stanowić problemu z generatorem liczb losowych. Tego rodzaju problem byłby oczywisty w mocno używanym pakiecie, takim jak Mathematica, na długo przedtem.
źródło
Kilka komentarzy na temat napisanego kodu:
experiment[n_]
ale nigdy go nie użyłeś, zamiast tego powtarzając jego definicję wtrialheadcount[n_]
.experiment[n_]
może być znacznie wydajniej zaprogramowany (bez użycia wbudowanej komendyBinomialDistribution
), ponieważTotal[RandomInteger[{0,1},n]/n
byłoby to równieżX
niepotrzebne.experiment[n_]
ściśle mieści się w przedziale od 0,4 do 0,6, jest bardziej efektywne dzięki pisaniuLength[Select[Table[experiment[10],{10^6}], 0.4 < # < 0.6 &]]
.Jednak w przypadku samego pytania, jak wskazuje Glen_b, rozkład dwumianowy jest dyskretny. Na 10 rzutów monetą z zaobserwowanymi główkami prawdopodobieństwo, że proporcja próbki głów wynosi dokładnie od 0,4 do 0,6, w rzeczywistości jest po prostu przypadkiem ; tj. Natomiast jeśli obliczyć prawdopodobieństwo, że udział próby wynosi między 0,4 a 0,6 włącznie , to byłoby Dlatego musisz tylko zmodyfikować kod, aby go użyćx p^=x/10 x=5
0.4 <= # <= 0.6
zamiast. Ale oczywiście możemy też pisaćTo polecenie jest około 9,6 razy szybsze niż oryginalny kod. Wyobrażam sobie, że ktoś jeszcze bardziej biegły niż Mathematica mógłby przyspieszyć to jeszcze bardziej.
źródło
Total@Map[Counts@RandomVariate[BinomialDistribution[10, 1/2], 10^6], {4, 5, 6}]
. PodejrzewamCounts[]
, że jako funkcja wbudowana jest wysoce zoptymalizowana w porównaniu doSelect[]
, która musi działać z dowolnymi predykatami.Wykonywanie eksperymentów prawdopodobieństwa w matematyce
Mathematica oferuje bardzo wygodne ramy do pracy z prawdopodobieństwami i rozkładami, a - chociaż zajęto się głównym problemem odpowiednich limitów - chciałbym użyć tego pytania, aby uczynić to bardziej zrozumiałym i być może przydatnym jako odniesienie.
Po prostu sprawmy, aby eksperymenty były powtarzalne i zdefiniuj opcje fabuły, które pasują do naszego gustu:
Praca z rozkładami parametrycznymi
Możemy teraz zdefiniować asymptotical dystrybucji dla jednego zdarzenia , które jest proporcja głowic w rzuca z (godziwej) monety:π n
Co daje nam wykres dyskretnego rozkładu proporcji:
Rozkładu możemy natychmiast użyć do obliczenia prawdopodobieństwa dla i :P.r [0,4 ≤ π≤ 0,6|π∼ B ( 10 ,12)) ] P.r [0,4 < π< 0,6|π∼ B ( 10 ,12)) ]
Przeprowadzanie eksperymentów Monte Carlo
Możemy użyć rozkładu dla jednego zdarzenia, aby wielokrotnie próbkować z niego (Monte Carlo).
Porównanie tego z rozkładem teoretycznym / asymptotycznym pokazuje, że wszystko pasuje do:
źródło