Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Python: Normaalijakauma ja hajonta

Sivun loppuun

Markus-3D [20.10.2013 07:35:33]

#

Yritän pähkäillä, miten saan todennäköisyydestä 0-1 keskihajontaluvun normaalijakaumassa. Jos 0,5 antaa tuloksen 0, niin miten lasketaan vastine todennäköisyydelle 0,9 pythonilla? Taulukkolaskennassa (OpenOffice) se on 1,2815515655 kaavalla NORMSINV(0,9). Eli tuon NORMSINV-komennon vastine tai laskentatapa pythonissa?

jmp [20.10.2013 11:04:40]

#

Pythonin vakiokirjastosta ei tietääkseni löydy suoraan sopivaa funktiota, mutta se onnistuu esimerkiksi SciPy-kirjastolla. Sen tilastomoduulista löytyy scipy.stats.norm, jonka "ppf"-metodia (tarkoitettu fraktiilien laskemiseen, mitkä ilmeisesti sinua kiinnostaakin) voi käyttää esim. näin:

from scipy.stats import norm

print(norm.ppf(0.5)) # Tulostaa 0.0
print(norm.ppf(0.9)) # Tulostaa 1.2815515655446004

Vastaavia funktioita saattaa löytyä muistakin kirjastoista (esim. numpy).

Markus-3D [20.10.2013 14:33:15]

#

Kiitoksia, jmp!
Juuri noita arvoja hain, mitä esimerkkikoodissasi on. Samoja tuloksia taulukkolaskentakin antoi, mutta pythoniin siirtäminen oli ongelma. Wikipediat sun muut nettitietolähteet eivät valaisseet, varsinkaan kun en osaa tulkita, miten mikäkin käppyröitä sisältävä kaava lasketaan.

Yritin nimenomaan etsiä taulukkolaskennan komentoa vastaavaa vakiokirjastosta, mutta täytynee todellakin sitten turvautua scipy/numpyyn. Ehkä sitten voisin saada selkoa siihen, voiko vakiokirjastolla tehdä vastaavaa. Aikaisemmin pärjäsin ilman norm.ppf()-tapaisia komentoja, mutta koodin rakentaminen on edennyt siihen pisteeseen, että tie nousi pystyyn, kun törmäsin tähän ongelmaan.

Lisäys:

Lievästi sanottuna erroria pukkasi, vaikka päällään seisoisi. En näköjään saa edes lisättyä kirjastoja, joten pitänee keksiä jokin sekundäärinen likimääräinen ratkaisu vakiokirjaston keinoin, vaikka sitten eri keinoin esilasketuilla muuttujilla. random.gauss()-komennon kanssa kikkailemalla yritys-erehdysmenetelmällä ja ei-meikäläisen-tuurilla jotakin likimääräistä osittaista tulosta saanee aikaan.

Epäilen kyllä, liekö edes ollut oikea pakettikaan, mikä olisi pitänyt ladata... Jahka naaman punoitus laskee, saatan yrittää vielä tuota lisäkirjaston toimimaan saamista tai oikein asentamista.

Jaska [20.10.2013 19:01:05]

#

Jos haluaa pärjätä vakiokirjastoilla, niin pitää varmaankin kirjoittaa itse algoritmi. Yhtälömuodossahan tuo on

1/2+int_0^x 1/sqrt{2*pi}e^{-t^2/2} dt=0.9, eli int_0^x e^{-t^2/2} dt=1.003. Tästä saa differentiaaliyhtälön y'(x)=e^{-x^2/2}, y(0)=1/2. Tälle voi sitten tehdä jonkun numeerisen algoritmin, kuten Eulerin tai Rungen–Kutan algoritmin.

Markus-3D [20.10.2013 22:02:50]

#

Kiitos, Jaska,

pitääpä yrittää saada toimimaan tuosta jotain. TypeError: unsupported operand type(s) for ^: 'float/int' and 'float/int' käy taas erittäin tutuksi, mutta aikansa trial-erroria, niin pitäisi onnistua joskus muuttelemalla koodia kunnes virhe katoaa. Minimissään kymmeniä kertoja tulee tulemaan tuontapainen virhe, mutta se on meikäläisittäin normaalia. Tutkittavaa ja etenkin yritettävää riittää toviksi.

Lisäys:

Jotain mätää on kyllä nyt jossakin, sillä yksinkertainen rivi:

print "2^2 antaa tulokseksi:",2^2

Ja tuloste:

2^2 antaa tulokseksi: 0

Mielestäni tuloksen pitäisi olla 4... Eipä ihme, jos erroria pukkaa.

Jaska [20.10.2013 22:17:16]

#

Pythonissa potenssiin korotus tapahtuu operaattorilla ** ja eksponenttifunktio on math.exp(x). Esimerkiksi

>>> from math import exp
>>> exp(8)
2980.9579870417283
>>> 2**13
8192

Tuo edellinen viestini oli LaTeXia.

Markus-3D [21.10.2013 08:34:16]

#

Välivaihe:

Näin olen toistaiseksi hahmottanut, mutta kohtaa A7 en edelleenkään ole saanut hahmotettua. Eli siis Jaskan [20.10.2013 19:01:05] viestin sisällön vääntäminen onnistuneesti python-muotoon on edelleen alkutekijöissään. En ole ainakaan saanut mitään järjellistä vielä aikaan (math.e**(-((A5-A6)**2)/(2*0.1**2)) jne hahmotelmia), mutta tässä laitan muut osat, jotta näkyy koodi kokonaisuudessaan. Ensin muuttujien selostukset:

A1=103
A2=109
A3=115
A4=A1,A2 ja A3 keskiarvo, eli 109
A5=hajonta, eli 6
A6=todennäköisyys, eli 0.9
A7=hajonta A6 todennäköisyydellä. Taulukkolaskenta antaa tulokseksi 1.2815515655 solun kaavalla =NORMSINV(A6)
A8=muutos keskiarvoon, eli 7.6893093933
A9=keskiarvo+muutos=tulos, eli 116.6893093933

Ja miten pythonissa:

import math
A1=103
A2=109
A3=115
A4=(A1+A2+A3)/3.0
A5=math.sqrt(((A1**2.0+A2**2.0+A3**2.0)-(A1+A2+A3)*(A1+A2+A3)/3.0)/(3.0-1.0))
A6=0.9
A7=???(A6)
A8=A7*A5
A9=A4+A8

Kaikki muuttujat korvattuna:

import math
A1=103
A2=109
A3=115
A4=(103+109+115)/3.0
A5=math.sqrt(((103**2.0+109**2.0+115**2.0)-(103+109+115)*(103+109+115)/3.0)/(3.0-1.0))
A6=0.9
A7=???(0.9)
A8=???(0.9)*6
A9=(103+109+115)/3.0+???(0.9)*math.sqrt(((103**2.0+109**2.0+115**2.0)-(103+109+115)*(103+109+115)/3.0)/(3.0-1.0))

Kohdan A7 ratkominen ei edelleenkään ole onnistuneesti ratkennut (=???). Lisättäköön, että matematiikan koulutusta ei peruskoulutasoa kummempaa ole, siksipä eri kaavojen matemaattiset hieroglyfit menevät yli ymmärryksen ja sillä pohjalla yritän kuitenkin opetella ja kehitellä uutta... :/ Jatkan kuitenkin pähkäilyä, ja koitan ottaa selkoa Wikipediankin avustuksella, vaikka vailla ymmärrystä.

jalski [21.10.2013 20:16:37]

#

Markus-3D kirjoitti:

Kohdan A7 ratkominen ei edelleenkään ole onnistuneesti ratkennut (=???). Lisättäköön, että matematiikan koulutusta ei peruskoulutasoa kummempaa ole, siksipä eri kaavojen matemaattiset hieroglyfit menevät yli ymmärryksen ja sillä pohjalla yritän kuitenkin opetella ja kehitellä uutta... :/ Jatkan kuitenkin pähkäilyä, ja koitan ottaa selkoa Wikipediankin avustuksella, vaikka vailla ymmärrystä.

Yksi toimiva ja kohtuullisen lyhyehkö algoritmi on kuvattuna täällä. Samaisen linkin takaa löytyy myös valmiit toteutukset usealle eri ohjelmointikielelle, mukaan lukien Python...

Markus-3D [22.10.2013 05:41:39]

#

!!!
Hyvin tarpeisiin vastaava ratkaisu! Kiitoksia, jalski!
Tein vertailevaa testiä ja saatujen tuloksien ero (python vs. OpenOffice) on käytännössä merkityksetön. Edelleenkin yritän ymmärtää itse algoritmia ja hakusessa on (oppi)kirjallisuutta, mikä helpottaisi eri kaavojen hieroglyfien merkityksien selvittämistä. Matematiikkaa aikoinaan lukenut mainitsi minulle jostakin Calculuksesta tai siihen verrattavasta, mikä myös saattaisi selvittää meikäläisellekin näitä saloja.

Jaska [22.10.2013 07:44:48]

#

Ainakin tuo Halleyn algoritmi näyttäisi perustuvan funktion toisen asteen Taylorin polynomiin, joka on sitten sijoitettu Newtonin iteraation kaavaan.

Opettelin aikanaan numeerisen integroinnin menetelmiä Kreyszigin kirjasta Advanced Engineering Mathematics. Kunnollinen oppikirja riippuu siitä, millä tasolla haluat ymmärtää taustalla olevaa matikkaa. Tuossa Kreyszigissä on selitetty menetelmiä ja joitakin todistuksiakin kirjassa esiintyy. Se oli ihan luettavissa oleva, kunhan lukion pitkä matikka oli hallussa.

Jos kuitenkin haluaa johtaa tulokset lähtien aksioomista, niin välivaiheita saa täydennellä oikein urakalla tai etsiä niitä muista kirjoista. Toisaalta on opettavaista täydentää yksityiskohtia.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta