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 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)
|
||||||
|
|
||||||
|
|
|
@ -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"]
|
||||||
|
|
|
@ -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
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
Reference in a new issue