1
0
Fork 0

Dokumentoi koodia

This commit is contained in:
Vili Sinervä 2022-09-24 11:25:45 +03:00
parent 59d01d11c8
commit ea8243cb63
4 changed files with 30 additions and 1 deletions

Binary file not shown.

Before

Width:  |  Height:  |  Size: 47 KiB

After

Width:  |  Height:  |  Size: 48 KiB

Before After
Before After

View file

@ -1,14 +1,29 @@
from trie import Trie """Omaa trie-tietorakennetta käyttävä n-asteen Markovin ketju.
Käyttö:
from markov_ketu import MarkovKetju
"""
from collections import deque from collections import deque
from random import choices from random import choices
from trie import Trie
class MarkovKetju: class MarkovKetju:
"""n-asteen Markovin ketju"""
def __init__(self, aste=1, trie=Trie()): def __init__(self, aste=1, trie=Trie()):
"""Aste voi olla mikä tahansa kokonaisluku n > 0. Uuden trien luomisen sijaan
ketjulle voi syöttää valmiin trien.
"""
if aste < 1:
raise ValueError("Aste ei voi olla < 1!")
self._trie = trie self._trie = trie
self._aste = aste self._aste = aste
self._menneet_tilat = deque() self._menneet_tilat = deque()
def kasittele_opetusdata(self, opetusdata: list): def kasittele_opetusdata(self, opetusdata: list):
"""Lukee opetusdata Markovin ketjun omaan trie-rakenteeseen.
Opetusdatan muoto on lista, jossa mikä tahansa määrä iteroitavia näytteitä. Esim:
["ABC", "ABB", "AAAAAA"]
"""
self._trie = Trie() self._trie = Trie()
for jono in opetusdata: for jono in opetusdata:
@ -22,19 +37,28 @@ class MarkovKetju:
self._trie.lisaa(alkio) self._trie.lisaa(alkio)
def aseta_alkuosa(self, alkuosa): def aseta_alkuosa(self, alkuosa):
"""Asettaa alkuosan, jonka perusteella Markovin ketju luo seuraavan merkin.
Alkuosan pituus on sama kuin ketjun aste, liian pitkästä alkuosasta jätetään
loppu pois.
"""
if len(alkuosa) < self._aste: if len(alkuosa) < self._aste:
raise ValueError("Liian lyhyt alkuosa!") raise ValueError("Liian lyhyt alkuosa!")
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):
"""Antaa seuraavan merkin muilla funktioilla annettujen opetusdata ja alkuosan
perusteella. Päivittää alkuosan automaattisesti seuraavaa askelta varten
"""
if len(self._menneet_tilat) < self._aste: if len(self._menneet_tilat) < self._aste:
raise ValueError("Markovin ketjulle ei ole asetettu sopivaa alkuosaa!") raise ValueError("Markovin ketjulle ei ole asetettu sopivaa alkuosaa!")
todennakoisyydet, merkit = self._trie.etsi_seuraavat(self._menneet_tilat) todennakoisyydet, merkit = self._trie.etsi_seuraavat(self._menneet_tilat)
if todennakoisyydet and merkit: if todennakoisyydet and merkit:
#Valitsee merkeistä yhden, valinta painotetaan triessä olevien todennäköisyyksien avulla
seuraava = choices(merkit, weights=todennakoisyydet)[0] seuraava = choices(merkit, weights=todennakoisyydet)[0]
#Päivittää alkuosan seuraavaa iteraatiota varten
self._menneet_tilat.popleft() self._menneet_tilat.popleft()
self._menneet_tilat.append(seuraava) self._menneet_tilat.append(seuraava)

View file

@ -2,6 +2,10 @@ import unittest
from markov_ketju import MarkovKetju from markov_ketju import MarkovKetju
class TestMarkovKetju(unittest.TestCase): class TestMarkovKetju(unittest.TestCase):
def test_0_aste(self):
self.assertRaises(ValueError, MarkovKetju, 0)
def test_seuraava_1_aste(self): def test_seuraava_1_aste(self):
ketju = MarkovKetju(1) ketju = MarkovKetju(1)
opetusdata = ["ABCDEA"] opetusdata = ["ABCDEA"]

View file

@ -1,4 +1,5 @@
"""Markovin ketjuille tarkoitettu trie-tietorakenteen implementaatio. """Markovin ketjuille tarkoitettu trie-tietorakenteen implementaatio.
Käyttö:
from trie import Trie from trie import Trie
""" """