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

Kätevä verkonnopeudenmittaustyökalu Macissä

MacOS Montereyn (MacOS 12) myötä Pääte-ohjelmaan on ilmestynyt uusi työkalu networkquality. Sen avulla on yksinkertaista mitata verkkoyhteyden laatu omasta Macistäsi. Toki erilaisia verkonnopeutta mittaavia työkaluja löytyy verkosta pilvin pimein niin pidän tästä työkalusta, sillä se on sisäänrakennettu Macin käyttöjärjestelmään

Työkalu toimii yksinkertaisesti käynnistämällä Pääte-ohjelma ja suorittamalla komento

networkquality

Työkalu tutkii kuinka pitkä aika kuluu tiedonsiirtoon osoitteeseen
https://mensura.cdn-apple.com/api/v1/gm/config
Kyseinen osoite on varmaankin jossain päin Yhdysvaltoja.

Upload capacity kertoo tiedonsiirtonopeuden omalta koneeltasi Applelle,
Download capacity kertoo tiedonsiirtonopeuden Applelta omalle koneellesi,
Upload ja download flows kertoo kuinka monta pakettia mittauksessa käytettiin ja
Responsiveness on  mitta, joka kertoo kuinka monta kertaa minuutissa paketit liikkuvat normaaliolosuhteissa palvelimen ja koneesi välillä. Yksikkö  RPM tarkoittaa Roundtrips per minute. 

esimerkkejä

Kotona Elisan verkossa lankayhteydellä.

Last login: Mon Apr 11 08:33:42 on console
### iMac ~ % networkquality
==== SUMMARY ====                                                                                         
Upload capacity: 9.951 Mbps
Download capacity: 83.371 Mbps
Upload flows: 12
Download flows: 12
Responsiveness: Medium (788 RPM)

Työpaikalla Hyllissä Helsingin opetusverkon valokaapeliyhteydessä Ethernetjohdolla.

Last login: Wed Apr 13 08:36:45 on console
###MacBook-Pro ~ % networkquality
==== SUMMARY ====                                                                                         
Upload capacity: 525.596 Mbps
Download capacity: 111.361 Mbps
Upload flows: 16
Download flows: 16
Responsiveness: High (4192 RPM)

Lankayhteydellä Hyllissä Freedome VPN päällä.

###MacBook-Pro ~ % networkquality   
==== SUMMARY ====                                                                                         
Upload capacity: 39.382 Mbps
Download capacity: 120.055 Mbps
Upload flows: 20
Download flows: 20
Responsiveness: High (1113 RPM)

Wifiyhteys koulun verkkoon, ei Freedomea.

###MacBook-Pro ~ % networkquality   
==== SUMMARY ====                                                                                         
Upload capacity: 105.708 Mbps
Download capacity: 37.994 Mbps
Upload flows: 16
Download flows: 20
Responsiveness: High (1072 RPM)

manuaali

Lisää tietoa komennosta saa sen manuaalisivulta kirjoittamalla Päätteeseen komennon

man networkQuality

Jos latasit manuaalin, niin pääset pois manuaalitilasta näppäilemällä kirjaimen

q

lähteet ja liitteet

Tarkempaa tietoa Responsiveness-käsitteestä

https://datatracker.ietf.org/doc/draft-ietf-ippm-responsiveness/

Macinstruct-sivu
https://www.macinstruct.com/tutorials/how-to-check-your-macs-network-quality/

Dan Petrovin sivu, josta alunperin huomasin tämän työkalun olemassaolon

https://danpetrov.xyz/macos/2021/11/14/analysing-network-quality-macos.html