Iti0210lab10: erinevus redaktsioonide vahel
Uus lehekülg: '= Peidetud Markovi mudel = == Sissejuhatus == Peidetud Markovi mudel (''hidden Markov model, HMM'') esitab mingit ajas muutuvat nähtust, mis käitub nagu Markovi ahel. Seejuur...' |
|||
| 7. rida: | 7. rida: | ||
[[Image:Ifi6057lab10_growth. | [[Image:Ifi6057lab10_growth.jpg|150px|right|aastaringid]] | ||
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''. | 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''. | ||
| 20. rida: | 20. rida: | ||
# 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. | # 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. | # 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 == | == Katse 1 == | ||
Redaktsioon: 11. aprill 2018, kell 21:25
Peidetud Markovi mudel
Sissejuhatus
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.

Lahendame järgmise ülesande (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.
30 aasta aastaringid proovis on (S-kitsas, M-keskmine, L-lai):
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
Ü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 hmmlearn. See sobib kokku scikit-learn paketiga, mida saab edasistes masinõppe ülesannetes kasutada. Sel juhul tuleb teha kõik katsed 1-3.
hmmlearnkasutuse spikker on antud juhendi lõpus. - Otsi ise sobiv lahendus (ei pea tingimata Python olema). See vajadus võib tekkida ka juhul, kui
hmmlearnpaketti 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:
H C H 0.7 0.3 C 0.3 0.7
Aastaringide suuruse tõenäosus, kui kliima on teada:
S M L H 0.1 0.4 0.5 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.
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?
hmmlearn spikker
Installimine Anaconda keskkonnas
conda install -c omnia hmmlearn
Juhul kui Anacondat ei ole, siis vt juhendit siit. Vaja on piisavalt värsket Pythonit ja scikit-learn paketti.
Näide põhineb õpiku vihma/vihmavarju mudelil (vt [AIMA] 15.1)
Importimine ja mudeli parameetrid:
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
Täieliku mudeli puhul kõige tõenäolisem olekute seeria (olek: 0-vihm, 1-kuiv; vaatlus: 0-vihmavari, 1-ei)
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)
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").
hm2 = hmm.MultinomialHMM(n_components=2, params="st", init_params="st")
hm2.emissionprob_ = sensor
hm2.fit([[1], [1], [0], [1]])
states = hm2.predict([[1], [1], [0], [1]])
print("Most likely hidden states (partially known)", states)
print("Learned transition probabilities")
print(hm2.transmat_)