Iti0210lab10: erinevus redaktsioonide vahel

Allikas: Lambda
Mine navigeerimisribale Mine otsikasti
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...'
 
PriitJ (arutelu | kaastöö)
 
(ei näidata sama kasutaja 20 vahepealset redaktsiooni)
6. rida: 6. rida:
[https://en.wikipedia.org/wiki/Hidden_Markov_model#A_concrete_example Wikipedia näide].
[https://en.wikipedia.org/wiki/Hidden_Markov_model#A_concrete_example Wikipedia näide].


Ülesandes rakendame HMM-i Twitteri säutsude meeleolu tuvastamiseks. Sellisest tegevusest on huvitatud näiteks ettevõtted, kes tahavad teada kasutajate suhtumist oma toodetesse või teenustesse, sotsiaalsete uurimuste tegijad jne.


[[Image:Ifi6057lab10_growth.png|150px|right|aastaringid]]
Meeleolu või hoiak on meie jaoks peidetud. Näeme aga, mida inimene on kirjutanud ning sõnade põhjal me juba oskame [[Iti0210lab91|lühikesi tekste klassifitseerida]]. Markovi mudeli toome sisse eelneva sõnamudeli täpsustamiseks ja stabiliseerimiseks (treeningandmete põhjal on alati tõenäolisem, et inimese hoiak kahe säutsu vahel ei muutu, kui et ta muutub).


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''.
Loomuliku keele ja meeleolude analüüs on keeruline ülesanne ja kodutöös ei taha me saada väga suurt täpsust. Eesmärk on aru saada, kuidas peidetud Markovi mudel töötab.


30 aasta aastaringid proovis on (S-kitsas, M-keskmine, L-lai):
== Teooria ja praktika ==


  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
Kõigepealt loe läbi [''AIMA''] 15.2.1 "Filtering and prediction", vajadusel mitu korda. Töös kasutame sellest ''Forward'' algoritmi.


Ü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).
Oletame, et meil on mingi vaatluste seeria e<sub>1</sub> kuni e<sub>n</sub>. Lisaks, võtame kusagilt algsed sisemise olekute tõenäosused X<sub>0</sub>.


Lahendamiseks on kaks alternatiivi:
Nüüd arvutatakse ''Forward'' algoritmiga <code>X1 = forward(X0, e1)</code>. Saame X<sub>1</sub>, millest saab jälle järgmise olekute jaotuse jne kuni lõpuni.  
# 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.


Meie Twitteri ülesande puhul on vaatlustulemusteks järjestikused säutsud. Iga säutsu juures arvutatakse eelmist ajahetke arvesse võttes uus sisemiste olekute tõenäosusjaotus. Tähistame võimalikke sisemisi olekuid ''positiivne'' ja ''negatiivne''.  Pane tähele, et ''Forward'' algoritm ühelgi hetkel ei vali, milline on "õige" peidetud olek. Läbi kogu tsükli peetakse arvet mõlema oleku tõenäosuse üle.


== Katse 1 ==
===''Forward'' algoritm ===


Anname ette tõenäosusmudeli. "H" tähistab tavalisest soojemat aastat, "C" tavaliselt külmemat aastat. Kliima eeltõenäosused:
Forward algoritm arvutab korraga ühe sammu arvutuses, ajahetkest ''t'' kuni ''t+1''.


  H  C
'''Näide''' Klassid on lühidalt: ''p'', ''n''.
  0.6 0.4


Üleminekumudel:
1. Sisemise oleku üleminek [[Image:Iti0210_hmm2.gif]].
<pre>
Eelmine sisemine olek (t): P(p) = 0.9, P(n) = 0.1
Oletame, et üleminekumudel on selline:
            uus olek
vana olek    p    n
  p          0.7  0.3
  n          0.2  0.8
Uus olek (t+1): P(p) = 0.7 * 0.9 + 0.2 * 0.1 = 0.65
                P(n) = 0.3 * 0.9 + 0.8 * 0.1 = 0.35
</pre>
2. Vaatlustulemuste lisamine [[Image:Iti0210_hmm3.gif]].
<pre>
Säuts: "w1 w2 w3 w2"
Oletame, et meil on sõnade sageduse mudel (NB mudeli stiilis):
P(w1|p) = 0.1    P(w1|n) = 0.001
P(w2|p) = 0.02    P(w2|n) = 0.1
P(w3|p) = 0.05    P(w3|n) = 0.05


    H   C
P(säuts|p) = P(w1|p) * P(w2|p) * P(w3|p) = 0.1 * 0.02 * 0.05 = 0.0001
  H  0.7 0.3
P(säuts|n) = P(w1|n) * P(w2|n) * P(w3|n) = 0.001 * 0.1 * 0.05 = 0.000005
  C  0.3 0.7
 
Sisemise oleku jaotus, arvestades säutsu sisu (t+1):
P(p) = 0.0001 * 0.65 = 0.000065   (* alpha)
P(n) = 0.000005 * 0.35 = 0.00000175  (* alpha)
</pre>
3. Normaliseerime
<pre>
Leiame tundmatu alpha, korrutame läbi. Lõplik jaotus (t+1):
P(p) = 0.97
P(n) = 0.03
</pre>


Aastaringide suuruse tõenäosus, kui kliima on teada:
=== Vajalikud tegevused ===


    S  M  L
# Leia üleminekute tõenäosused treeningandmetelt.
  H  0.1 0.4 0.5
# Treeni eelmise kodutöö Naiivne Bayesi mudel säutsudelt. Oluline on eelkõige sõnade esinemine mõlema klassi puhul, eeltõenäosust võib kasutada ''Forward'' algoritmi esimeses sammus, aga ei pea.
  C  0.7 0.2 0.1
# Implementeeri ülaltoodud kirjelduse järgi ''Forward'' algoritm, nii et see saaks sisendiks listi säutsudest ning suudaks anda sisemiste olekute (''positiivne'', ''negatiivne'') jaotuse peale viimast sammu või ka peale iga sammu.


Koosta nende andmetega peidetud Markovi mudel ja leia seda kasutades kõige tõenäolisem kliima aastate kaupa.
== Treeningandmed ==


== Katse 2 ==
Treenimiseks [http://dijkstra.cs.ttu.ee/~priit/Iti0210_lab101.zip leiad failid siit].


# Anna mudelile ette ainult kliima ja aastaringide seos.
* <code>users_5000.csv</code> - väiksem fail 5000 kasutaja säutsudega
# Treeni mudel, kasutades aastaringide andmeid.
* <code>users_50000.csv</code> - suurem fail
# Vaata treenitud üleminekumudelit. Kas see sarnaneb eeldatud üleminekumudeliga?


== Katse 3 ==
Treenimiseks on parem rohkem andmeid kasutada, aga esimesteks katsetusteks võib väiksem fail mugavam olla.


# Treeni mudel ainult aastaringide andmeid kasutades.
Failid on CSV formaadis, ilma päiseta.
# Vaata treenitud emissiooni- (kuidas sõltub aastaringi laius kliimast) mudelit
# Mis on õpitud algtõenäosused?


== <code>hmmlearn</code> spikker ==
<pre>
klass,ajatempel,kasutaja," säuts"
</pre>


Installimine Anaconda keskkonnas
Kasutajad on anonümiseeritud. Klass on kas <code>0</code> - negatiivne või <code>4</code> - positiivne, mida võib tõlgendada meeleolu või hoiakuna.


  conda install -c omnia hmmlearn
Tõenäosusjaotuste ''P(sõna|klass)'' leidmiseks pead säutsud sõnadeks tükeldama ja samasugust loendamist kasutama nagu [[Iti0210lab91|eelmises ülesandes]]. Täiendavalt on kasulik kirjavahemärke eemaldada. Võid eemaldada ka "@" märgiga algavad stringid.


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.
== Katsetamine ==


Näide põhineb õpiku vihma/vihmavarju mudelil (vt [''AIMA''] 15.1)
Kas nad on heas või halvas tujus? Leia vastus oma programmiga. Kasuta ''Forward'' algoritmi. Eeltõenäosusteks võid võtta P(positiivne) = 0.5 ja P(negatiivne) = 0.5 või leida nende jaotus treeningandmetelt.


Importimine ja mudeli parameetrid:
Kasutaja A:


<pre>
<pre>
from hmmlearn import hmm
"@anon @anon thx 4 the laughs. I'm going to sleep. My head hurts &amp; my scan is butt crack early. Have fun @anon "
import numpy as np
"@anon doing good. Going to take pics of my sidekick in a little bit. She is going to prom today "
"@anon how are you feeling that both of your teams lost hahahahahaha...sorry "
"@anon lol looks like I'm just going to catch a regular season game NEXT YEAR "
"@anon I like that. I'm going to put that one in my notebook "
"@anon ok kidding about Dwight. He's cute but I really admire him as a bball player.  I love the game again "
"Wow once again home alone for the night...hmm now this is sad. I have no life. Nah I take that back, have time to spend w/ God "
"@anon just wanted to say hi "
"I'm sorry if I'm a downer but it's hard to not be emotional right now. I didn't want to see Monica pass so I stayed home... "
"@anon yeah yeah I know.....not really thrilled about that place sorry....that was my bad "
</pre>


initial = np.array([0.5, 0.5])                # initial state probability
Kasutaja B:
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>
"Going to search out areas we would like for our dream home to also home my home based business one day soon. "
"Have beautiful dreams all, I'm off to snuggle down with my beautiful babies as they are done with the outdoors. "
"@anon Cheeers to a dull day girl.. hoping for one here also. "
"@anon That sounds like an awesome day.  Have a terrific time. "
"Mmmm.. fresh nettle tea so yummy. "
"I'm wondering what to have for Breaky along with my iced nettle tea??!  Don't really feel hungry for anything else."
"@anon Oh I love this and have joined myself.. or maybe it was Kind Blog I joined.. I best make sure.   Peace to you lovely lady!"
"@anon Cool!  Thank you.. it's a beautiful flower now is it medicinal? "
"@anon Good morning hairy vegan rock loving guy!  No dreams that I remember but a lovely sleep non the less! What did you dream?"
"@anon Sweet book!  I think.. lol  Sounds good anyway. "
"@anon I'm excited but offering someone a sound healing also sounds great. I'm starting Reiki at the farmers market also! Here we go! "
"http://url - Full Moon Wild Rose Petal Rose Quartz honey, vinegar and infusion picked and co-created today. Love!"
</pre>
</pre>


Täieliku mudeli puhul kõige tõenäolisem olekute seeria (olek: 0-vihm, 1-kuiv; vaatlus: 0-vihmavari, 1-ei)
Kasutaja C:


<pre>
<pre>
hm1 = hmm.MultinomialHMM(n_components=2)
"@anon @anon you guys are going to make me cry "
hm1.startprob_ = initial
"@anon I AM NOT MEAN "
hm1.transmat_ = transition
"@anon your not following me yet??? "
hm1.emissionprob_ = sensor
"@anon why do you have nothing to say?? huh huh "
 
"@anon i am not showing off you think so crude of me your so mean  you make me want to cry"
states = hm1.predict([[1], [1], [0], [1]])
"@anon yeah i know i did that to my friends cats too "
print("Most likely hidden states (known model)", states)
"@anon thanks for biting me  hahaha"
"@anon how sad "
"@anon @anon hello swati chuby cheeks where are you people??!??!?!?!    "
"@anon but you scare me when you get mad "
"@anon i am not a goddess no more cause colin is not there to help me rule! "
"@anon happy ur back not happy chuby cheeks and i still fighting "
"@anon oh i am okay my dog just had a seizure "
</pre>
</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").
Kasutaja D:


<pre>
<pre>
hm2 = hmm.MultinomialHMM(n_components=2, params="st", init_params="st")
"i can't go to sleep "
hm2.emissionprob_ = sensor
"@anon thanx "
 
"...on his car system...crazy...i love random moments "
hm2.fit([[1], [1], [0], [1]])
"no more puppy  i'm really sad"
states = hm2.predict([[1], [1], [0], [1]])
"@anon it's a mini poodle my sis was going to get but she just told me some things came up and she's not getting it anymore "
print("Most likely hidden states (partially known)", states)
"i'm all awake but no one else is "
print("Learned transition probabilities")
print(hm2.transmat_)
</pre>
</pre>

Viimane redaktsioon: 11. aprill 2019, kell 16:31

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.

Ülesandes rakendame HMM-i Twitteri säutsude meeleolu tuvastamiseks. Sellisest tegevusest on huvitatud näiteks ettevõtted, kes tahavad teada kasutajate suhtumist oma toodetesse või teenustesse, sotsiaalsete uurimuste tegijad jne.

Meeleolu või hoiak on meie jaoks peidetud. Näeme aga, mida inimene on kirjutanud ning sõnade põhjal me juba oskame lühikesi tekste klassifitseerida. Markovi mudeli toome sisse eelneva sõnamudeli täpsustamiseks ja stabiliseerimiseks (treeningandmete põhjal on alati tõenäolisem, et inimese hoiak kahe säutsu vahel ei muutu, kui et ta muutub).

Loomuliku keele ja meeleolude analüüs on keeruline ülesanne ja kodutöös ei taha me saada väga suurt täpsust. Eesmärk on aru saada, kuidas peidetud Markovi mudel töötab.

Teooria ja praktika

Kõigepealt loe läbi [AIMA] 15.2.1 "Filtering and prediction", vajadusel mitu korda. Töös kasutame sellest Forward algoritmi.

Oletame, et meil on mingi vaatluste seeria e1 kuni en. Lisaks, võtame kusagilt algsed sisemise olekute tõenäosused X0.

Nüüd arvutatakse Forward algoritmiga X1 = forward(X0, e1). Saame X1, millest saab jälle järgmise olekute jaotuse jne kuni lõpuni.

Meie Twitteri ülesande puhul on vaatlustulemusteks järjestikused säutsud. Iga säutsu juures arvutatakse eelmist ajahetke arvesse võttes uus sisemiste olekute tõenäosusjaotus. Tähistame võimalikke sisemisi olekuid positiivne ja negatiivne. Pane tähele, et Forward algoritm ühelgi hetkel ei vali, milline on "õige" peidetud olek. Läbi kogu tsükli peetakse arvet mõlema oleku tõenäosuse üle.

Forward algoritm

Forward algoritm arvutab korraga ühe sammu arvutuses, ajahetkest t kuni t+1.

Näide Klassid on lühidalt: p, n.

1. Sisemise oleku üleminek .

Eelmine sisemine olek (t): P(p) = 0.9, P(n) = 0.1
Oletame, et üleminekumudel on selline:
             uus olek
vana olek     p    n
   p          0.7  0.3
   n          0.2  0.8
Uus olek (t+1): P(p) = 0.7 * 0.9 + 0.2 * 0.1 = 0.65
                P(n) = 0.3 * 0.9 + 0.8 * 0.1 = 0.35

2. Vaatlustulemuste lisamine .

Säuts: "w1 w2 w3 w2"
Oletame, et meil on sõnade sageduse mudel (NB mudeli stiilis):
P(w1|p) = 0.1     P(w1|n) = 0.001
P(w2|p) = 0.02    P(w2|n) = 0.1
P(w3|p) = 0.05    P(w3|n) = 0.05

P(säuts|p) = P(w1|p) * P(w2|p) * P(w3|p) = 0.1 * 0.02 * 0.05 = 0.0001
P(säuts|n) = P(w1|n) * P(w2|n) * P(w3|n) = 0.001 * 0.1 * 0.05 = 0.000005

Sisemise oleku jaotus, arvestades säutsu sisu (t+1):
P(p) = 0.0001 * 0.65 = 0.000065   (* alpha)
P(n) = 0.000005 * 0.35 = 0.00000175   (* alpha)

3. Normaliseerime

Leiame tundmatu alpha, korrutame läbi. Lõplik jaotus (t+1):
P(p) = 0.97
P(n) = 0.03

Vajalikud tegevused

  1. Leia üleminekute tõenäosused treeningandmetelt.
  2. Treeni eelmise kodutöö Naiivne Bayesi mudel säutsudelt. Oluline on eelkõige sõnade esinemine mõlema klassi puhul, eeltõenäosust võib kasutada Forward algoritmi esimeses sammus, aga ei pea.
  3. Implementeeri ülaltoodud kirjelduse järgi Forward algoritm, nii et see saaks sisendiks listi säutsudest ning suudaks anda sisemiste olekute (positiivne, negatiivne) jaotuse peale viimast sammu või ka peale iga sammu.

Treeningandmed

Treenimiseks leiad failid siit.

  • users_5000.csv - väiksem fail 5000 kasutaja säutsudega
  • users_50000.csv - suurem fail

Treenimiseks on parem rohkem andmeid kasutada, aga esimesteks katsetusteks võib väiksem fail mugavam olla.

Failid on CSV formaadis, ilma päiseta.

klass,ajatempel,kasutaja," säuts"

Kasutajad on anonümiseeritud. Klass on kas 0 - negatiivne või 4 - positiivne, mida võib tõlgendada meeleolu või hoiakuna.

Tõenäosusjaotuste P(sõna|klass) leidmiseks pead säutsud sõnadeks tükeldama ja samasugust loendamist kasutama nagu eelmises ülesandes. Täiendavalt on kasulik kirjavahemärke eemaldada. Võid eemaldada ka "@" märgiga algavad stringid.

Katsetamine

Kas nad on heas või halvas tujus? Leia vastus oma programmiga. Kasuta Forward algoritmi. Eeltõenäosusteks võid võtta P(positiivne) = 0.5 ja P(negatiivne) = 0.5 või leida nende jaotus treeningandmetelt.

Kasutaja A:

"@anon @anon thx 4 the laughs. I'm going to sleep. My head hurts & my scan is butt crack early. Have fun @anon "
"@anon doing good. Going to take pics of my sidekick in a little bit. She is going to prom today "
"@anon how are you feeling that both of your teams lost hahahahahaha...sorry "
"@anon lol looks like I'm just going to catch a regular season game NEXT YEAR "
"@anon I like that. I'm going to put that one in my notebook "
"@anon ok kidding about Dwight. He's cute but I really admire him as a bball player.  I love the game again "
"Wow once again home alone for the night...hmm now this is sad. I have no life. Nah I take that back, have time to spend w/ God "
"@anon just wanted to say hi "
"I'm sorry if I'm a downer but it's hard to not be emotional right now. I didn't want to see Monica pass so I stayed home... "
"@anon yeah yeah I know.....not really thrilled about that place sorry....that was my bad "

Kasutaja B:

"Going to search out areas we would like for our dream home to also home my home based business one day soon. "
"Have beautiful dreams all, I'm off to snuggle down with my beautiful babies as they are done with the outdoors. "
"@anon Cheeers to a dull day girl.. hoping for one here also. "
"@anon That sounds like an awesome day.  Have a terrific time. "
"Mmmm.. fresh nettle tea so yummy. "
"I'm wondering what to have for Breaky along with my iced nettle tea??!   Don't really feel hungry for anything else."
"@anon Oh I love this and have joined myself.. or maybe it was Kind Blog I joined.. I best make sure.   Peace to you lovely lady!"
"@anon Cool!  Thank you.. it's a beautiful flower now is it medicinal? "
"@anon Good morning hairy vegan rock loving guy!  No dreams that I remember but a lovely sleep non the less!  What did you dream?"
"@anon Sweet book!  I think.. lol  Sounds good anyway. "
"@anon I'm excited but offering someone a sound healing also sounds great.  I'm starting Reiki at the farmers market also! Here we go! "
"http://url - Full Moon Wild Rose Petal Rose Quartz honey, vinegar and infusion picked and co-created today.  Love!"

Kasutaja C:

"@anon @anon you guys are going to make me cry "
"@anon I AM NOT MEAN "
"@anon your not following me yet??? "
"@anon why do you have nothing to say?? huh huh "
"@anon i am not showing off you think so crude of me your so mean  you make me want to cry"
"@anon yeah i know i did that to my friends cats too "
"@anon thanks for biting me  hahaha"
"@anon how sad "
"@anon @anon hello swati chuby cheeks where are you people??!??!?!?!    "
"@anon but you scare me when you get mad "
"@anon i am not a goddess no more cause colin is not there to help me rule! "
"@anon happy ur back not happy chuby cheeks and i still fighting "
"@anon oh i am okay my dog just had a seizure "

Kasutaja D:

"i can't go to sleep "
"@anon thanx "
"...on his car system...crazy...i love random moments "
"no more puppy  i'm really sad"
"@anon it's a mini poodle my sis was going to get but she just told me some things came up and she's not getting it anymore "
"i'm all awake but no one else is "