50 likes | 189 Views
LISP-OPPGAVER Skriv en prosedyre som konverterer en liste til en array, altså en prosedyre som leser inn en liste og returnerer en endimensjonal array med de same elementene. Skriv en prosedyre med den omvendte oppførselen.
E N D
LISP-OPPGAVER • Skriv en prosedyre som konverterer en liste til en array, altså en prosedyre som leser inn en liste og returnerer en endimensjonal array med de same elementene. • Skriv en prosedyre med den omvendte oppførselen. • Skriv en prosedyre som tar inn en todimensjonal array og et første-argument (som altså angir en kolonne) og som returnerer listen av elementer i denne kolonnen. • Lag en prosedyre som tar inn en liste av tall og som returnerer summen av disse tallene. • Den siste oppgaven angår oppnøsting av backpointer-tabellen i Viterbi-algoritmen. Først litt repetisjon:
0 0 0 0 0.5 0.1 0.85 0.05 0.1 0.35 0.05 0.15 0.4 0.55 0.1 0.8 Vi har gitt en HMM med tre tilstander (1,2,3) og tre mulige observasjoner fisk, bolle og floete. Når vi legger til en tenkt start-tilstand (for å representere initielle sannsynligheter for de tre egentlige tilstandene) har vi: a-tabell (transisjonsmatrise) b-tabell fra 0 1 2 3 1 2 3 0 bolle 1 til 2 fisk 3 floete
Anta nå at vi for eksempel observerer sekvensen O = fisk bolle fisk floete floete bolle og ønsker å finne den tilsvarende sekvensen av tilstander som har høyest sannsynlighet gitt disse observasjonene, altså argmax_Q P(Q | O) , hvilket er det samme som argmax_Q P(Q & O). Viterbi-algoritmen, tar utgangspunkt i det siste, og lager en 3 X 6-tabell (3 tilstander, og observasjons-sekvens av lengde 6) der viterbi(i,j) inneholder den største mulige verdien for P(q_1, , q_{j-1}, i & o_1, .. o_j) når o_1, … o_j er de j første observasjonene fra sekvensen O, og q_1, , q_{j-1} varierer over alle tilstands-sekvenser av lengde j-1: 1 2 3 fisk bolle fisk floete floete bolle viterbi(3,1) er altså p(3 & fisk) = a(0,3)* b(3,fisk) = 0.4 * 0.15 = 0.06, mens viterbi(3,2) er den største verdien av p(q,3& fisk,bolle) når q varierer over tilstandene, altså den største verdien i mengden {p(1,3&fisk,bolle), p(2,3&fisk,bolle),p(3,3&fisk,bolle)} = {viterbi(1,fisk)*a(1,3)*b(3,bolle), viterbi(2,fisk)*a(2,3)*b(3,bolle), viterbi(3,fisk)*a(3,3)*b(3,bolle)} = {0.175*0.55*0.6, 0.005*0.1*0.6, 0.06*0.8*0.6} = {|0.05775, 0.0003, 0.0288}. Legg merke til at den største verdien er den første i mengden, svarende til en sekvens som var innom tilstand 1 i forrige skritt.
For å kunne finne tilbake til den mest sannsynlige sekvensen av tilstander, har vi egen tabell itillegg som nettopp registrerer hvilken tilstand den mest sannsynlige sekvensen så lang var innom i forrige skritt. Dette er den såkalte backpointer-tabellen, som i det aktuelle eksemplet ser slik ut: fisk bolle fisk floete floete bolle Vi legger merke til at backpointer(3,1) = 1, i tråd med obsrevasjonen over. For å finne mest sannsynlige sekvens av tilstander gitt observasjonene, går vi først gjenom siste rad i Viterbi-tabellen, og ser vi finner den største verdien i kolonne 3. Dette betyr at den mest sannsynlige sekvensen ender med 3. Så slår vi opp i viterbi[3,6], hvor vi lser av at forrige tilstand i den mest sannsynlige sekvensen også var 3, og vi fortsetter videre bakover og finner til slutt hele sekvensen 133333. Skriv nå et program som gjør denne oppnøstingen, altså et prgogram som får inn et tall n som angir lengden på den obsreverte sekvensen, pluss en viterbi-tabell av dimensjon 3Xn og en bacpointer-tabell av samme dimensjon, og som leverer ut den mest sannsynlige tilstands-sekvensen, gjerne representert som en liste av lengde n.
Test den gjerne på dataene over, altså når n er 6, viterbi er #2A((0.175 0.00875 0.001010625 5.5223445e-5 1.1928264e-4 7.9521764e-5) (0.0050000004 0.0030625 4.3312504e-4 9.355501e-4 1.8711002e-4 2.0874463e-6) (0.060000002 0.05775 0.0069300006 0.0013860002 2.7720004e-4 1.3305603e-4)) og backpointer er #2A((0 1 3 2 2 2) (0 1 3 3 3 1) (0 1 3 3 3 3))