1D satunnaiskävely Pythonilla & histogrammeja – osa 2

Edellisessä tarinassani käsittelin yksiulotteista satunnaiskävelyä sellaisessa tapauksessa, että lähdetään origosta ja arvotaan mennäänkö askel oikealle vai vasemmalle, askeleen pituus on vakio. Tutkitaan nyt tilannetta, jossa askeleen pituus on satunnainen.

Katso edellisestä tarinasta koodin kommentit, käytän tässä edellisen tarinan koodeja ja muokkaan niitä.

Tavoitteena on selvittää, millainen jakauma syntyy kulkijan kävelyn päätepisteistä, kun kävelyä toistetaan vaikkapa 200 kertaa.

loppupaikan tutkiminen

Piirretään Matplotlibin avulla satunnaista liikettä kuvaava kuvaaja muokkamalla edellisen tarinani Pythonkoodia. Rivillä 1 ladataan randomfunktio kirjastostaan. Rivillä 7 arvotaan satunnaisluku, ja tuotetaan arpa-niminen satunnaisluku, joka on välillä -1 < x < 1.

Viidenkymmenen askeleen jälkeen päädyttiin noin neljän yksikön päähän lähtöpisteestä.

histogrammit

Muokkaan edellisen tarinan vastaavaa koodia ja tuotan histogrammin lopullisen paikan jakaumasta.

Kuvassa 1000 satunnaiskävelyn loppupaikan jakaumahistogrammina. Jakauma näyttää samanlaiselta kuin edellisessäkin tarinassa, mutta varmaankin se on ”kapeampi” ainakin terveellä järjellä ajateltuna.

molemman tyyppiset satunnaiskävelyt

Tehdään koodinpätkä, jossa tuotetaan kahden tyyppistä satunaiskävelyä. Tyypissä 1 askeleen pituus on vakio -1 tai +1. Tyypissä 2 askeleen pituus on satunnaisluku eli askel on muotoa 2*random() – 1.

Kuvaaja näyttää päällisin puolin oikealta, mustat tolpat muodostavat kapemman jakauman. Silti kuvaaja on virheellinen, sillä tolppien pituuksien summa pitäisi olla yhtä suuri. Mustien tolppien pituus on viallinen. Tämä johtuu siitä, että hist-komento skaalaa vaaka-suunnassa arvot-listojen (loppulista1 ja loppulista2) suurmimman ja pienimmän arvon mukaan luokkiin (bins). Niinpä kuvassa mustien palkkien leveys on kapeampi kuin sinisten.

Eron saa näkymään selkeämmin, kun vähentää palkkien määrää. Seuraavan kuvaajan koodi on muuten sama, mutta riveillä 19 ja 20 on:

Kymmenellä palkilla näkee selvästi, että mustat palkit ovat kapeampia.

Mikäli skaalauksen haluaa toimivan oikein, niin pitää määrittää molemmille jakaumille samat reunat histogrammiin. 

Seuraavassa koodissa riveillä 21-22 määritetään leveämmän jakauman loppulista1:n suurin ja pienin arvo. Rivillä 21 valitaan reunoista itseisarvoltaan suurempi, näin saadaan reunat määriteltyä symmetrisesti origon ympärille. Rivien 24 ja 26 range määrittää histogrammin tolppien vasemman ja oikean reunan. Lisäsin vielä mukaan selitteen (legend) riveillä 22 ja 33.

Jätän lukijan pohdiskelemaan millainen funktio kuvaa oheisia jakaumia, kun annetaan n:n kasvaa oikein suureksi.

Palaan aiheeseen lähiaikoina, silloin tutkin 2D ja 3D satunnaiskävelyä.


Esimerkkikoodit löytyvät sivulta https://colab.research.google.com/drive/1mgy8Cca3wWDR2F_KnR-vY1gwCXHVVdCd?usp=sharing

1D satunnaiskävely Pythonilla ja histogrammeja

Tutkitaan Pythonin avulla yksiulotteista satunnaiskävelyä. Samalla kokeilen eri tapoja tulostaa histogrammeja Pythonin kirjastojen avulla. Yksiulotteisessa satunnaiskävelyssä lähdetään origosta ja arvotaan mennäänkö askel oikealle vai vasemmalle. Tätä toistetaan, kunnes aletaan miettiä, mihin sitä oikein on taas tultu eli kuinka kaukana origosta ollaan. 

Tässä ensimmäisessä versiossa askeleen pituus on vakio, tutkitaan myöhemmin tilannetta, jossa askeleen pituus on satunnainen.

konna

Käytän ohjelmointiympäristönä Googlen Colabia. 

Teen ensin pienen mallin kävelystä  käyttäen Turtle-grafiikkaa. Kävelyn suunta on y-akselin suunnassa ja en kuljetakaan konnaa pelkästään y-akselin suunnassa, vaan liikutan sitä myös vaakasuunnassa, näin liike saadaan näkyville aika-paikka -koordinaatistossa.

Monessa muussa Python-editorissa koko kilpikonnakirjaston saa käskyrivillä

from turtle import *

Ladataan ensin Colabissa ColabTurtle-kirjasto. Tämä pitää olla suoritettuna ennen kirjaston käyttöä.

Rivillä 1 ladataan choice()-funktio. Se arpoo rivin 14 arvot listasta suunnan. Riveillä 9-12 konna siirretään ikkunan vasempaan reunaan. Rivien 16-20 for-silmukassa liikutetaan konnaa arvonnan mukaisesti.

Alla yksi konnan reitti satunnaiskävelyssä. Se taisi päätyä aika lähelle lähtöpaikkaansa.

loppupaikan tutkiminen

Unohdetaan kilpikonna ja tutkitaan vain satunnaiskulkijan paikkaa. Rivillä 6 alkupaikaksi määritellään origo. Rivillä 9 for silmukassa vanhaan paikkaan lisätään arvottu luku. Rivin 9 

paikka+=arpa 

tarkoittaa samaa kuin 

paikka=paikka+arpa

Piirretään matplotlibin avulla kilpokonnan kävelyn tyyppinen kuvaaja. Rivillä 2 ladataan matplotlib-kirjasto. Rivit 12 ja 13 tulostavat kuvaajan.

Luodaan lista nimeltä loppulista, joka kerää viimeisen paikan. Tässä tarvitaan kahta sisäkkäistä for-silmukkaa. Sisemmässä silmukassa riveillä 8-11 liikutetaan kulkijaa 100 kertaa ja ulommassa silmukassa rivit 6-11 lisätään viimeinen paikka loppulista-listaan append-metodin avulla. 

Tutkitaan huvin vuoksi, toimiiko koodi Abittin editorilla, jota voi kokeilla sivulla https://cheat.abitti.fi/build/index.html?fi&programming

histogrammit

Piirretään histogrammeja eri menetelmillä. Sopivilla funktioilla Python laskee esiintymien lukumäärät automaattisesti.

Rivillä 2 ladataan matplotlib-kirjasto. Rivillä 15 on varsinainen histogrammi, bins =”auto” tarkoittaa, että komento järkeilee fiksuimman tavan määrittää tolppien lukumäärä. Jos ”auto”:n korvaa luvulla, niin se on tolppien lukumäärä.

Seuraavassa kuvaajassa rivillä 15 rwidth parametri kertoo tolpan leveyden.

Seuraavaan kuvaajaan on lisätty tekstiä riveillä 15 ja 16.  plt.txt-funktion kaksi ensimmäistä arvoa ovat koordinaatit kuvaajassa.

Panda on Pythonkirjasto, jonka auttaa taulukoidun datan käsittelyä. Alla esimerkki histogrammista Pandan perusasetuksilla.

Seaborn-kirjasto on suunniteltu datan esittämiseen, tätä minun pitänee opiskella lisää.

pieni todistustehtävä 1

Kun piirtelin näitä histogrammeja, niin tajusin, että jos konna liikkuu parillisen määrän askelia, niin sen päätepiste on aina parillisessa pisteessä ja parittomilla askelilla päätepiste on pariton luku. Miksi? Tässä pieni todistustehtävä lukiolaisille.

pieni todistustehtävä 2

Miksi nuo histogrammit ovat normaalijakauman/binomijakauman näköisiä?


Palaan satunnaiskävelyyn tulevaisuudessa. Erilaiset satunnaiskävelyt, 2D ja 3D satunnaiskävely muun muassa kiinnostavat harrastelijakoodaajaa.

Colab-tiedosto löytyy täältä https://colab.research.google.com/drive/1IlzADCNPgwUMi2ujzstU9pPcH1o-NcKE?usp=sharing

lähteet

Hyvä Python histogramminpiirto-ohje
https://realpython.com/python-histograms/

Seaborn-histogrammiohje
https://seaborn.pydata.org/generated/seaborn.displot.html

Tätä kirjaa käytän apuna kuvaajia piirrellessäni
Yim, Chung, Yu. Matplotlib for Python Developers Second Edition. Pact. 2018

Hyvä artikkeli 1d satunnaiskävelystä
https://galileo.phys.virginia.edu/classes/152.mf1i.spring02/RandomWalk.htm

Wikipediassa
https://en.wikipedia.org/wiki/Random_walk

Monty Hall Pythonilla – osa 3 

Viime vuoden puolella julkaisin kaksi artikkelia liittyen Monty Hall -probleemaan. Lupasin tehdä simulaation yleisestä tapauksesta, jossa vuohia on vähintään kaksi kappaletta ja autoja vähintään yksi. Lasketaan sellaisen tapauksen todennäköisyyksiä, että kilpailija aina vaihtaa valintansa, kun yksi vuohi on paljastettu.

Mikäli et ole lukenut aikaisempia tarinoita, niin katso täältä.

https://mikkorahikka.blog/2021/10/08/monty-hall-pythonilla/

https://mikkorahikka.blog/2021/10/29/monty-hall-pythonilla-osa-2/

Laitetaan tähän vielä muistin virkistykseksi Wikipediasta Monty Hall -pelin määritelmä: ”Monty Hallin ongelmassa kilpailijalla on edessään kolme ovea. Yhden oven takana on palkintona auto, kahden muun takana vuohi. Kilpailija, joka ei tiedä minkä oven takana mikin palkinto on, saa valita ovista yhden. Valittuaan oven hän ei vielä avaa sitä. Jäljelle jääneistä kahdesta ovesta avataan toinen, ja sen takana on aina vuohi. Tämän jälkeen kilpailija saa valita, vaihtaako ensin valitsemansa oven toiseen jäljellä olevaan suljettuun oveen, vai pitääkö ensin valitsemansa oven.”

python

Kolmen vuohen ja kahden auton tapauksessa vaikutti siltä, että todennäköisyys oli noin 8/15. 

Tehdään ohjelma, jossa vuohien ja autojen määrää voi muuttaa. Vuohia pitää olla vähintään kaksi, jotta peliä voi pelata ja autoja vähintään yksi. Kuvan koodi on Spyder-ohjelmointiympäristöstä.

Selitän rivillä 50 olevan yleisen kaavan johtamisen tarina loppupuolella.

Kuva, joka sisältää kohteen teksti

Kuvaus luotu automaattisesti

Alla tulos Spyderin konsolista.

Nyt kun koodi näyttää toimivan, niin pakkohan sitä on kokeilla ylioppilaskoejärjestelmässä. Kopioin koodista rivit 10-52 ja sijoitin ne osoitteessa https://cheat.abitti.fi/build/index.html?fi&programming olevaan YTL:n Pythoniin. Ohjelma toimi, niin kuin sen pitikin.

Kuva, joka sisältää kohteen teksti

Kuvaus luotu automaattisesti

kuvaaja

3D-kuvaajan piirtäminen onnistuu helpoimmin, kun käyttää numpy-kirjastoa. Sillä saa kerralla laskettua funktion arvot matriisiin (2D taulukkoon), ohjelmakoodissa muuttuja Z rivillä 19. En kommentoi sen tarkemmin mitä kukin rivi tekee, jos haluat oppia, niin kokeile. Joskus opiskelen matplotlib ja numpy-kirjastot siten, että osaisin selittää miten ne oikeasti toimivat. Nyt olen vielä aloittelija niiden kanssa touhutessa. Useimmiten saan kuvaajat haluamikseni yrityksellä ja erehdyksellä.

Kuva, joka sisältää kohteen teksti

Kuvaus luotu automaattisesti

Alla tuotos.

Tätä koodia ei voi suorittaa YTL:n Pythonissa, sillä se ei tuota kuvia. Alla vihreilmoitus osoitteessa https://cheat.abitti.fi/build/index.html?fi&programming

Kuva, joka sisältää kohteen teksti

Kuvaus luotu automaattisesti

kuvaaja GeoGebralla

Edellisestä kuvasta on mielestäni hankala hahmottaa millaisilla arvoilla pelaaja voittaa. Niinpä päädyin käyttämään GeoGebraa.

Alla 3D-kuva

Loin sen kirjoittamalla GeoGebra 5:n syöttökenttään

p(x, y) = (x y + y (y – 1)) / ((x + y) (x + y – 2))

pp(x, y) = Jos(1 ≤ x < 11 ∧ 2 <= y < =11, p(x, y))

z=1/2

Piilotin p:n kuvaajasta. Ei tuonkaan kuvan pyörittely hahmota minulle, millainen alue on kyseessä.

Piirtoalueen xy-tasolle saa alueen, jossa p ≥ ½, näkyville seuraavasti. Jouduin hieman auttamaan GeoGebraa, jotta se osasi värittää epäyhtälön alueen.

Kuva, joka sisältää kohteen teksti

Kuvaus luotu automaattisesti

Matikkanörtit voivat tutkia, millaiseta käyrästä on kyse.

ratkaisu kirjainlaskennolla

Koodeissa näkyvä yleisen ratkaisun lauseke voidaan johtaa oheisen puukaavion avulla.

Merkitään vuohien lukumäärää v:llä ja autojen a:lla.

Pelaaja voitttaa, jos toinen valinta on a. 

Jos hän valitsee vuohen ensin, niin sen todennäköisyys on v/(a + v). Tässä tapauksessa hän saa auton todennäköisyydellä a/(a + v – 2). Mahdollisuudet vähenevät kahdella, sillä hän ei voi valita samaa kuin ennen ja yksi vuohi on vähemmän.

Jos hän valitsee auton ensin, niin sen todennäköisyys on a/(a + v). Auton todennäköisyys tämän jälkeen on (a -1)(a + v + 2).

koodi

Tarinassa esitetty koodi löytyy Colabista

https://colab.research.google.com/drive/1Y2ODH9KNV4NX5OJ_8AbzWEzYW4Mz5Uoc?usp=sharing

lähteitä

Monty Hall englanniksi Wikipediass

https://en.wikipedia.org/wiki/Monty_Hall_problem

ja suomeksi https://fi.wikipedia.org/wiki/Monty_Hallin_ongelma

Lisää pohdittavaa tässä artikkelissa

https://www.researchgate.net/publication/233565559_The_Monty_Hall_Problem_Reconsidered