Trình tạo số ngẫu nhiên của Mathicala đi chệch khỏi xác suất nhị thức?


9

Vì vậy, giả sử bạn lật một đồng xu 10 lần và gọi đó là "sự kiện". Nếu bạn chạy, 1.000.000 trong số các "sự kiện" này, tỷ lệ các sự kiện có đầu từ 0,4 đến 0,6 là bao nhiêu? Xác suất nhị thức sẽ gợi ý điều này là khoảng 0,65, nhưng mã Mathicala của tôi đang cho tôi biết khoảng 0,24

Đây là cú pháp của tôi:

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

Đâu là tai nạn?


3
có lẽ đây sẽ phù hợp tốt hơn để Mathematica stackexchange mathematica.stackexchange.com
Jeromy Anglim

1
@JeromyAnglim Trong trường hợp này tôi nghi ngờ vấn đề có lẽ là do lý do chứ không phải là mã hóa.
Glen_b -Reinstate Monica 2/215

@Glen_b Tôi đoán điều chính là có một câu trả lời hay ở đâu đó trên internet, mà bạn dường như đã cung cấp. :-)
Jeromy Anglim

Câu trả lời:


19

Các rủi ro là sử dụng nghiêm ngặt ít hơn.

Với mười lần tung, cách duy nhất để có được kết quả tỷ lệ đầu từ 0,4 đến 0,6 là nếu bạn có đúng 5 đầu. Điều đó có xác suất khoảng 0,246 ( ), đó là về những gì mô phỏng của bạn (chính xác ) đưa cho.(105)(12)100.246

Nếu bạn bao gồm 0,4 và 0,6 trong giới hạn của mình, (tức là 4, 5 hoặc 6 đầu trong 10 lần ném), kết quả có xác suất khoảng 0,656, nhiều như bạn mong đợi.

Suy nghĩ đầu tiên của bạn không phải là một vấn đề với trình tạo số ngẫu nhiên. Đó là loại vấn đề rõ ràng trong một gói được sử dụng nhiều như Mathicala từ lâu.


Trớ trêu thay, @TimMcKnight đã chứng minh xác suất nhị thức cho chúng tôi.
Simon Kuang

8

Một số ý kiến ​​về mã bạn đã viết:

  • Bạn đã xác định experiment[n_]nhưng không bao giờ sử dụng nó, thay vào đó lặp lại định nghĩa của nó trong trialheadcount[n_].
  • experiment[n_]có thể được lập trình hiệu quả hơn nhiều (không sử dụng lệnh tích hợp BinomialDistribution) Total[RandomInteger[{0,1},n]/nvà điều này cũng sẽ Xkhông cần thiết.
  • Đếm số lượng các trường hợp experiment[n_]nghiêm ngặt trong khoảng từ 0,4 đến 0,6 được thực hiện hiệu quả hơn bằng cách viết Length[Select[Table[experiment[10],{10^6}], 0.4 < # < 0.6 &]].

Nhưng, đối với chính câu hỏi thực tế, như Glen_b chỉ ra, phân phối nhị thức là rời rạc. Trong số 10 lần tung đồng xu với đầu được quan sát, xác suất tỷ lệ mẫu của các đầup = x / 10 x = 5 Pr [ X = 5 ] = ( 10xp^=x/10đúng giữa 0,4 và 0,6 trên thực tế chỉ là trường hợp ; tức là, Trong khi đó, nếu bạn đã tính toán xác suất mà tỷ lệ mẫu là giữa 0,4 và 0,6 bao gồm , đó sẽ là Do đó, bạn chỉ cần sửa đổi mã của mình để sử dụngx=5

Pr[X= =5]= =(105)(0,5)5(1-0,5)50,246094.
Pr[4X6]= =Σx= =46(10x)(0,5)x(1-0,5)10-x= =67210240,65625.
0.4 <= # <= 0.6thay thế. Nhưng tất nhiên, chúng tôi cũng có thể viết
Length[Select[RandomVariate[BinomialDistribution[10,1/2],{10^6}], 4 <= # <= 6 &]]

Lệnh này nhanh hơn khoảng 9,6 lần so với mã gốc của bạn. Tôi tưởng tượng ai đó thậm chí thành thạo hơn tôi ở Mathematica có thể tăng tốc hơn nữa.


2
Bạn có thể tăng tốc mã của mình thêm 10 lần nữa bằng cách sử dụng Total@Map[Counts@RandomVariate[BinomialDistribution[10, 1/2], 10^6], {4, 5, 6}]. Tôi nghi ngờ Counts[], là một chức năng tích hợp, được tối ưu hóa cao so với Select[], nó phải làm việc với các vị từ tùy ý.
David Zhang

1

Thực hiện các thí nghiệm xác suất trong Mathicala

Mathematica cung cấp một khung rất thoải mái để làm việc với xác suất và phân phối và - trong khi vấn đề chính về các giới hạn phù hợp đã được giải quyết - tôi muốn sử dụng câu hỏi này để làm rõ hơn và có thể hữu ích như một tài liệu tham khảo.

Chúng ta chỉ cần làm cho các thí nghiệm có thể lặp lại và xác định một số tùy chọn cốt truyện để phù hợp với sở thích của chúng ta:

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

Làm việc với các bản phân phối tham số

Bây giờ chúng ta có thể định nghĩa phân phối tiệm cận cho một sự kiện là tỷ lệ của những người đứng đầu trong ném một đồng xu (công bằng):nπ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
        ]
    }
]

Điều này cho chúng ta âm mưu phân bố tỷ lệ rời rạc: Lý thuyếtDistributionPlot

Chúng tôi có thể sử dụng phân phối ngay lập tức để tính xác suất cho và :Pr[Pr[0,4π0,6|π~B(10,12)]Pr[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}

Làm thí nghiệm Monte Carlo

Chúng ta có thể sử dụng phân phối cho một sự kiện để liên tục lấy mẫu từ nó (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

So sánh điều này với phân phối lý thuyết / tiệm cận cho thấy mọi thứ khá phù hợp với:

Show @ {
   theoreticalPlot,
   empiricalPlot
}

So sánh phân phối


Bạn có thể tìm thấy một bài viết tương tự với nhiều thông tin cơ bản hơn liên quan đến Mathicala trên Mathematica SE .
viết
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.