Iti0210lab10

Allikas: Lambda
Redaktsioon seisuga 11. aprill 2018, kell 21:20 kasutajalt PriitJ (arutelu | kaastöö) (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...')
(erin) ←Vanem redaktsioon | Viimane redaktsiooni (erin) | Uuem redaktsioon→ (erin)
Mine navigeerimisribale Mine otsikasti

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.


aastaringid
aastaringid

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:

  1. 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. hmmlearn kasutuse spikker on antud juhendi lõpus.
  2. Otsi ise sobiv lahendus (ei pea tingimata Python olema). See vajadus võib tekkida ka juhul, kui hmmlearn 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:

    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

  1. Anna mudelile ette ainult kliima ja aastaringide seos.
  2. Treeni mudel, kasutades aastaringide andmeid.
  3. Vaata treenitud üleminekumudelit. Kas see sarnaneb eeldatud üleminekumudeliga?

Katse 3

  1. Treeni mudel ainult aastaringide andmeid kasutades.
  2. Vaata treenitud emissiooni- (kuidas sõltub aastaringi laius kliimast) mudelit
  3. 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_)