1
0
Fork 0

Poista alkuosan täydennys Markovin ketjusta. Siirtyy muualle

This commit is contained in:
Vili Sinervä 2022-10-01 14:39:50 +03:00
parent 724665d309
commit 83152ddc4a
2 changed files with 6 additions and 35 deletions

View file

@ -16,7 +16,6 @@ class MarkovKetju:
raise ValueError("Aste ei voi olla < 1!") raise ValueError("Aste ei voi olla < 1!")
self._trie = trie self._trie = trie
self._opetusdata = []
self._aste = aste self._aste = aste
self._menneet_tilat = deque() self._menneet_tilat = deque()
@ -26,9 +25,8 @@ class MarkovKetju:
["ABC", "ABB", "AAAAAA"] ["ABC", "ABB", "AAAAAA"]
""" """
self._trie = Trie() self._trie = Trie()
self._opetusdata = opetusdata
for jono in self._opetusdata: for jono in opetusdata:
if len(jono) > self._aste: if len(jono) > self._aste:
alkio = deque(jono[0:self._aste+1]) alkio = deque(jono[0:self._aste+1])
self._trie.lisaa(alkio) self._trie.lisaa(alkio)
@ -40,20 +38,11 @@ class MarkovKetju:
def aseta_alkuosa(self, alkuosa): def aseta_alkuosa(self, alkuosa):
"""Asettaa alkuosan, jonka perusteella Markovin ketju luo seuraavan merkin. """Asettaa alkuosan, jonka perusteella Markovin ketju luo seuraavan merkin.
Alkuosan pituus on vähintään yksi, liian pitkästä alkuosasta jätetään Alkuosan pituus on sama kuin ketjun aste, liian pitkästä alkuosasta jätetään
loppu pois. Liian lyhyttä täydennetään opetusdatan perusteella. loppu pois.
""" """
while len(alkuosa) < self._aste: if len(alkuosa) < self._aste:
ketju = MarkovKetju(len(alkuosa)) raise ValueError("Liian lyhyt alkuosa!")
ketju.kasittele_opetusdata(self._opetusdata)
ketju.aseta_alkuosa(alkuosa)
alkuosa = [x for x in alkuosa]
seuraava = ketju.seuraava()
if not seuraava:
raise ValueError("Alkuosan täydennys ei onnistunut!")
alkuosa.append(seuraava)
self._menneet_tilat = deque([alkuosa[i] for i in range(0, self._aste)]) self._menneet_tilat = deque([alkuosa[i] for i in range(0, self._aste)])
def seuraava(self): def seuraava(self):

View file

@ -10,9 +10,6 @@ class TestMarkovKetju(unittest.TestCase):
ketju = MarkovKetju(1) ketju = MarkovKetju(1)
opetusdata = ["ABCDEA"] opetusdata = ["ABCDEA"]
ketju.kasittele_opetusdata(opetusdata) ketju.kasittele_opetusdata(opetusdata)
self.assertRaises(ValueError, ketju.seuraava)
ketju.aseta_alkuosa("E") ketju.aseta_alkuosa("E")
self.assertEqual("A", ketju.seuraava()) self.assertEqual("A", ketju.seuraava())
@ -38,25 +35,10 @@ class TestMarkovKetju(unittest.TestCase):
self.assertEqual("E", ketju.seuraava()) self.assertEqual("E", ketju.seuraava())
self.assertEqual("A", ketju.seuraava()) self.assertEqual("A", ketju.seuraava())
self.assertRaises(ValueError, ketju.aseta_alkuosa, "F")
ketju.aseta_alkuosa("EF") ketju.aseta_alkuosa("EF")
self.assertFalse(ketju.seuraava()) self.assertFalse(ketju.seuraava())
def test_alkuosan_taydennys(self):
ketju = MarkovKetju(2)
opetusdata = ["ABCDEAB"]
ketju.kasittele_opetusdata(opetusdata)
self.assertRaises(ValueError, ketju.aseta_alkuosa, "F")
ketju.aseta_alkuosa("A")
self.assertEqual("C", ketju.seuraava())
self.assertEqual("D", ketju.seuraava())
self.assertEqual("E", ketju.seuraava())
self.assertEqual("A", ketju.seuraava())
self.assertEqual("B", ketju.seuraava())
self.assertEqual("C", ketju.seuraava())
def test_seuraava_todennakoisyys(self): def test_seuraava_todennakoisyys(self):
"""Testaa, että Markovin ketjun antamat merkit ilmenevät likimain oikeilla yleisyyksillä""" """Testaa, että Markovin ketjun antamat merkit ilmenevät likimain oikeilla yleisyyksillä"""
ketju = MarkovKetju(1) ketju = MarkovKetju(1)