Lisää satunnaisuuden testaus Markovin ketjulle
This commit is contained in:
parent
97a9b4fca7
commit
d056f42b55
1 changed files with 36 additions and 0 deletions
|
@ -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)
|
||||
|
|
Reference in a new issue