środa, lipca 13, 2011

Symulacja zamiast kartki i ołówka ;-)

Podobno w Google potrafią zadać pytanie w stylu "Jeśli prawdopodobieństwo tego, że w ciągu godziny obserwacji drogi zobaczymy samochód wynosi 0.95, to ile wynosi prawdopodobieństwo zobaczenia samochodu w ciągu 30 minut?".

Umiałem sobie ten wzorek wyprowadzić "od tyłu", zakładając że skoro P(dla 1 godziny)=0.95 to P(dla 2 godzin)=P(dla 1 godziny)+(1-P(dla 1 godziny))*P(dla 1 godziny). Ale nigdy nie byłem go pewien ;-)
Powiedzmy, że doszedłem do tego intuicyjnie ;-) a tak naprawdę wg. takiego schematu, to że auto zauważymy w ciągu pierwszej godziny wynosi 0.95, czyli z prawdopodobieństwem 0.5 nie zauważymy auta, w takim przypadku drugą godzinę będziemy ślepić na tą drogę i wtedy to prawdopodobieństwo znów będzie wynosiło 0.95.
Sprawdziłem to też w głowie ;-) Dla prostszego przypadku gdy to prawdopodobieństwo wynosi 0.5, wtedy możemy przez 2 godziny nic nie zobaczyć, co będzie 1 przypadkiem, możemy zobaczyć coś w godzinie 1 lub w godzinie 2, to są 2 przypadki i w końcu możemy zobaczyć coś 2 razy w ciągu 2 godzin. Czyli mamy 3 sytuacje gdy coś widzimy na 4 możliwe, czyli prawdopodobieństwo wynosi 0.75. Co się zgadza ze wzorkiem.

Ale z matematyką to ja zawsze tak na bakier byłem, nie mam tego talentu, który mają niektórzy i nie widzę czy wynik ma sens czy nie ma (zwykle z tego powodu, że nie umiem używać kartki i ołówka więc liczę to w głowie i się gubię).
To napisałem program do testowania ;-)




Program przeprowadza 10000 razy symulację naszego zjawiska.
I wyniki wychodzą sensowne.
OK, to wiemy, że mój pomysł ma ręce i nogi, teraz trzeba w drugą stronę.
Ale jak nasz wzór działa to mamy, że:
P(dla 2 godzin)=P(dla 1 godziny)+(1-P(dla 1 godziny))*P(dla 1 godziny)
P(dla 2 godzin)=2*P(dla 1 godziny)-P(dla 1 godziny)2
P(dla 1 godziny)2-2*P(dla 1 godziny)+P(dla 2 godzin)=0

 W końcu mamy (i tu się trochę gubię ;-)), że:
P(dla 1 godziny)=(2-sqrt(4-4*P(dla 2 godzin)))/2 lub P(dla 1 godziny)=(2+sqrt(4-4*P(dla 2 godzin)))/2

Jak sobie zmienimy pytanie Google tak by czasy były o 2 większe (żeby skorzystać z wzorów u góry) to odpowiedź wychodzi 0.776 ;-)
Jak ją podstawić do symulacji to wynik wychodzi 0.95, czyli tyle ile powinno.

I teraz jest tak, że zapewne to wszystko u góry można znając matematykę powiedzieć z głowy, a ja głupi muszę to liczyć i sobie symulatory pisać ;-)
Plus jest taki, że mój sposób jest zabawniejszy :-)


Podobne postybeta
JavaScript wygrywa z Pythonem w symulacji ;-)
Dziwne wykorzystanie twierdzenia Bayesa :-)
Randki w ujęciu Bayesowskim ;-)
Reality Check
Dlaczego wybrałem Windows XP dla mojego EEE?