1
0
Fork 0

Lisää satunnaisuuden testaus Markovin ketjulle

This commit is contained in:
Vili Sinervä 2022-09-24 11:04:57 +03:00
parent 97a9b4fca7
commit d056f42b55

View file

@ -34,3 +34,39 @@ class TestMarkovKetju(unittest.TestCase):
self.assertRaises(ValueError, ketju.aseta_alkuosa, "F")
ketju.aseta_alkuosa("EF")
self.assertFalse(ketju.seuraava())
def test_seuraava_todennakoisyys(self):
"""Testaa, että Markovin ketjun antamat merkit ilmenevät likimain oikeilla yleisyyksillä"""
ketju = MarkovKetju(1)
opetusdata = ["AA", "AB", "AB", "AC", "AC", "AC"]
ketju.kasittele_opetusdata(opetusdata)
"""yhteensä ja marginaali määrittävät testin tarkkuuden ja toisaalta virheellisen hylkäämisen
todennäköisyyden. 3000 iteraatiota ja 5% marginaali tarkoittaa, että todellinen määrä saa
poiketa odotetusta enintään 3000*0,05 = 150, joka on mielestäni riittävän suuri tarkkuus.
Todennäköisyys, että testi ei mene läpi, kun Markovin ketju toimii oikein, on luokkaa 10^-8.
"""
yhteensa = 3000
marginaali = 0.05
a_maara = 0
b_maara = 0
c_maara = 0
for i in range(yhteensa):
ketju.aseta_alkuosa("A")
merkki = ketju.seuraava()
if merkki == "A":
a_maara += 1
elif merkki == "B":
b_maara += 1
elif merkki == "C":
c_maara += 1
a_osuus = a_maara / yhteensa # Pitäisi olla noin 1/6
b_osuus = b_maara / yhteensa # Pitäisi olla noin 2/6
c_osuus = c_maara / yhteensa # Pitäisi olla noin 3/6
self.assertAlmostEqual(a_osuus, 1/6, delta=marginaali)
self.assertAlmostEqual(b_osuus, 2/6, delta=marginaali)
self.assertAlmostEqual(c_osuus, 3/6, delta=marginaali)