Generator liczb losowych Mathematiki odbiega od prawdopodobieństwa dwumianowego?


9

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?


3
być może lepiej by to pasowało do mathematica stackexchange mathematica.stackexchange.com
Jeromy Anglim

1
@JeromyAnglim W tym przypadku podejrzewam, że problem dotyczy raczej rozumowania niż ścisłego kodowania.
Glen_b

@Glen_b Chyba najważniejsze jest to, że gdzieś w Internecie jest dobra odpowiedź, którą, jak się wydaje, dostarczyłeś. :-)
Jeromy Anglim

Odpowiedzi:


19

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)100.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.


Jak na ironię @TimMcKnight wykazało dla nas dwumianowe prawdopodobieństwo.
Simon Kuang

8

Kilka komentarzy na temat napisanego kodu:

  • Zdefiniowałeś go, experiment[n_]ale nigdy go nie użyłeś, zamiast tego powtarzając jego definicję w trialheadcount[n_].
  • experiment[n_]może być znacznie wydajniej zaprogramowany (bez użycia wbudowanej komendy BinomialDistribution), ponieważ Total[RandomInteger[{0,1},n]/nbyłoby to również Xniepotrzebne.
  • Liczenie przypadków, w których experiment[n_]ściśle mieści się w przedziale od 0,4 do 0,6, jest bardziej efektywne dzięki pisaniu Length[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ćxp^=x/10x=5

Par[X=5]=(105)(0,5)5(1-0,5)50,246094.
Par[4X6]=x=46(10x)(0,5)x(1-0,5)10-x=67210240,65625.
0.4 <= # <= 0.6zamiast. Ale oczywiście możemy też pisać
Length[Select[RandomVariate[BinomialDistribution[10,1/2],{10^6}], 4 <= # <= 6 &]]

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.


2
Możesz przyspieszyć swój kod o kolejny współczynnik 10, używając Total@Map[Counts@RandomVariate[BinomialDistribution[10, 1/2], 10^6], {4, 5, 6}]. Podejrzewam Counts[], że jako funkcja wbudowana jest wysoce zoptymalizowana w porównaniu do Select[], która musi działać z dowolnymi predykatami.
David Zhang

1

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:

SeedRandom["Repeatable_151115"];
$PlotTheme = "Detailed";
SetOptions[Plot, Filling -> Axis];
SetOptions[DiscretePlot, ExtentSize -> Scaled[0.5], PlotMarkers -> "Point"];

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

distProportionTenCoinThrows = With[
    {
        n = 10, (* number of coin throws *)
        p = 1/2 (* fair coin probability of head*)
    },
    (* derive the distribution for the proportion of heads *)
    TransformedDistribution[
        x/n,
        x \[Distributed] BinomialDistribution[ n, p ]
    ];

With[
    {
        pr = PlotRange -> {{0, 1}, {0, 0.25}}
    },
    theoreticalPlot = DiscretePlot[
        Evaluate @ PDF[ distProportionTenCoinThrows, p ],
        {p, 0, 1, 0.1},
        pr
    ];
    (* show plot with colored range *)
    Show @ {
        theoreticalPlot,
        DiscretePlot[
            Evaluate @ PDF[ distProportionTenCoinThrows, p ],
            {p, 0.4, 0.6, 0.1},
            pr,
            FillingStyle -> Red,
            PlotLegends -> None
        ]
    }
]

Co daje nam wykres dyskretnego rozkładu proporcji: TheoreticalDistributionPlot

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))]

{
    Probability[ 0.4 <= p <= 0.6, p \[Distributed] distProportionTenCoinThrows ],
    Probability[ 0.4 < p < 0.6, p \[Distributed] distProportionTenCoinThrows ]
} // N

{0,65625, 0,246094}

Przeprowadzanie eksperymentów Monte Carlo

Możemy użyć rozkładu dla jednego zdarzenia, aby wielokrotnie próbkować z niego (Monte Carlo).

distProportionsOneMillionCoinThrows = With[
    {
        sampleSize = 1000000
    },
    EmpiricalDistribution[
        RandomVariate[
            distProportionTenCoinThrows,
            sampleSize
        ]
    ]
];

empiricalPlot = 
    DiscretePlot[
        Evaluate@PDF[ distProportionsOneMillionCoinThrows, p ],
        {p, 0, 1, 0.1}, 
        PlotRange -> {{0, 1}, {0, 0.25}} , 
        ExtentSize -> None, 
        PlotLegends -> None, 
        PlotStyle -> Red
    ]
]

EmpirialDistributionPlot

Porównanie tego z rozkładem teoretycznym / asymptotycznym pokazuje, że wszystko pasuje do:

Show @ {
   theoreticalPlot,
   empiricalPlot
}

ComparingDistribution


Możesz znaleźć podobny post z dodatkowymi informacjami na temat Mathematica na Mathematica SE .
gwr
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.