Dokumentoi koodia
This commit is contained in:
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 |
|
@ -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 random import choices
|
||||
from trie import Trie
|
||||
|
||||
class MarkovKetju:
|
||||
"""n-asteen Markovin ketju"""
|
||||
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._aste = aste
|
||||
self._menneet_tilat = deque()
|
||||
|
||||
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()
|
||||
|
||||
for jono in opetusdata:
|
||||
|
@ -22,19 +37,28 @@ class MarkovKetju:
|
|||
self._trie.lisaa(alkio)
|
||||
|
||||
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:
|
||||
raise ValueError("Liian lyhyt alkuosa!")
|
||||
self._menneet_tilat = deque([alkuosa[i] for i in range(0, self._aste)])
|
||||
|
||||
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:
|
||||
raise ValueError("Markovin ketjulle ei ole asetettu sopivaa alkuosaa!")
|
||||
|
||||
todennakoisyydet, merkit = self._trie.etsi_seuraavat(self._menneet_tilat)
|
||||
|
||||
if todennakoisyydet and merkit:
|
||||
#Valitsee merkeistä yhden, valinta painotetaan triessä olevien todennäköisyyksien avulla
|
||||
seuraava = choices(merkit, weights=todennakoisyydet)[0]
|
||||
|
||||
#Päivittää alkuosan seuraavaa iteraatiota varten
|
||||
self._menneet_tilat.popleft()
|
||||
self._menneet_tilat.append(seuraava)
|
||||
|
||||
|
|
|
@ -2,6 +2,10 @@ import unittest
|
|||
from markov_ketju import MarkovKetju
|
||||
|
||||
class TestMarkovKetju(unittest.TestCase):
|
||||
|
||||
def test_0_aste(self):
|
||||
self.assertRaises(ValueError, MarkovKetju, 0)
|
||||
|
||||
def test_seuraava_1_aste(self):
|
||||
ketju = MarkovKetju(1)
|
||||
opetusdata = ["ABCDEA"]
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
"""Markovin ketjuille tarkoitettu trie-tietorakenteen implementaatio.
|
||||
Käyttö:
|
||||
from trie import Trie
|
||||
"""
|
||||
|
||||
|
|
Reference in a new issue