Lahendame järgmise ülesande ([https://www.cs.sjsu.edu/~stamp/RUA/HMM.pdf algallikas]): ''dr. J. S. uurib globaalse naftakompanii X tellimusel tööstusrevolutsiooni eelset kliimat. Hetkel on tal käsil vanast majast pärit palgist võetud proov. On teada, et aastaringid on laiemad puu kasvuks soodsatel aastatel ja kitsamad halvematel aastatel. Kuna teada on ka maja ehitamise aasta, saabki sellele eelnevate aastate kliima kohta järeldusi teha''.
== ''Forward'' algoritm ==
30 aasta aastaringid proovis on (S-kitsas, M-keskmine, L-lai):
1. Loe [''AIMA''] 15.2.1
S M S S L L M M L M S M M S S L S L L L L L L L L L L S L S
== Algandmed ==
Ülesannet saab proovida lahendada nii juhul, kui meil on mudeli parameetrid (nagu näiteks sooja aasta järgnemise tõenäosus külmale aastale) teada (katse 1) kui ka oluliselt vähema informatsiooniga (katsed 2 ja 3).
Lahendamiseks on kaks alternatiivi:
# Kasuta Pythoni paketti [https://github.com/hmmlearn/hmmlearn hmmlearn]. See sobib kokku [http://scikit-learn.org/ scikit-learn] paketiga, mida saab edasistes masinõppe ülesannetes kasutada. Sel juhul tuleb teha kõik katsed 1-3. <code>hmmlearn</code> kasutuse spikker on antud juhendi lõpus.
# Otsi ise sobiv lahendus (ei pea tingimata Python olema). See vajadus võib tekkida ka juhul, kui <code>hmmlearn</code> paketti mingil põhjusel ei õnnestu installida. Oluline on, et lahendus suudaks täielikult ette antud tõenäosusmudeli ja vaatluste seeria puhul järeldada sisemiste olekute seeria. Kuna see variant eeldab rohkem iseseisvat uurimist, siis on kohustuslik ainult katse 1.
== Katse 1 ==
Anname ette tõenäosusmudeli. "H" tähistab tavalisest soojemat aastat, "C" tavaliselt külmemat aastat. Kliima eeltõenäosused:
H C
0.6 0.4
Üleminekumudel:
Üleminekumudel:
34. rida:
21. rida:
C 0.3 0.7
C 0.3 0.7
Aastaringide suuruse tõenäosus, kui kliima on teada:
Emissioonimudel (sõnumite sageduse tõenäosusjaotus, kui seose olek on antud):
S M L
S M L
40. rida:
27. rida:
C 0.7 0.2 0.1
C 0.7 0.2 0.1
Koosta nende andmetega peidetud Markovi mudel ja leia seda kasutades kõige tõenäolisem kliima aastate kaupa.
Eeltõenäosused
== Katse 2 ==
# Anna mudelile ette ainult kliima ja aastaringide seos.
# Treeni mudel, kasutades aastaringide andmeid.
# Vaata treenitud üleminekumudelit. Kas see sarnaneb eeldatud üleminekumudeliga?
== Katse 3 ==
# Treeni mudel ainult aastaringide andmeid kasutades.
# Vaata treenitud emissiooni- (kuidas sõltub aastaringi laius kliimast) mudelit
# Mis on õpitud algtõenäosused?
== <code>hmmlearn</code> spikker ==
Installimine Anaconda keskkonnas
conda install -c omnia hmmlearn
Juhul kui Anacondat ei ole, siis vt juhendit [https://github.com/hmmlearn/hmmlearn siit]. Vaja on piisavalt värsket Pythonit ja <code>scikit-learn</code> paketti.
Näide põhineb õpiku vihma/vihmavarju mudelil (vt [''AIMA''] 15.1)
Importimine ja mudeli parameetrid:
<pre>
from hmmlearn import hmm
import numpy as np
initial = np.array([0.5, 0.5]) # initial state probability
transition = np.array([[0.7, 0.3],[0.3, 0.7]]) # state transition
sensor = np.array([[0.9, 0.1], [0.2, 0.8]]) # observation, given state
</pre>
Täieliku mudeli puhul kõige tõenäolisem olekute seeria (olek: 0-vihm, 1-kuiv; vaatlus: 0-vihmavari, 1-ei)
<pre>
hm1 = hmm.MultinomialHMM(n_components=2)
hm1.startprob_ = initial
hm1.transmat_ = transition
hm1.emissionprob_ = sensor
states = hm1.predict([[1], [1], [0], [1]])
print("Most likely hidden states (known model)", states)
</pre>
Osaline mudel. Anname ainult selle info, mis tõenäosus erineva ilma puhul on vihmavarju esinemisel. Mudeli treenimisel anname ette, et õppida tuleb ainult eeltõenäosused ja olekute üleminekud ("st").
Peidetud Markovi mudel (hidden Markov model, HMM) esitab mingit ajas muutuvat nähtust, mis käitub nagu Markovi ahel. Seejuures ei ole see nähtus meile otseselt vaadeldav, vaid me näeme ainult mingit kaudset tunnust. Vt.
Wikipedia näide.