Tik-61.181 Informaatiotekniikan erikoiskurssi I, syksy 98

Arvostelu

Pisteitä annettiin seuraavasti: koodit 4p, mallit 4p (1 + 1 + 2) sekä vertailu optimaaliseen 2p. Yhteensä jaossa oli siis 10p.

Aritmeettinen koodaus

Pakkaajan ja purkajan matlab koodit. Oletan, että kaikki työn tehneet tuntevat aritmeettisen koodauksen periaatteen (ainakin palautetuista töistä näin voisi päätellä). Ainoa kompastuskivi oli oikeastaan laskentatarkkuuden huomiointi, mutta sitäkään ei arvosteltu kovin ankaralla kädellä.

Aritmeettisessa koodauksessa pakattu bittijono tulkitaan reaaliluvuksi nollan ja ykkösen välillä. Täytyy pitää huoli siitä, että päätös siitä kummalle puolelle rajaa luku sijoittuu voidaan tehdä äärellisessä ajassa. Koodissa tämä on varmistettu siten, että raja pyöristetään koko ajan samaan tarkkuuteen kuin millä lukua esitetään. Samaten on pidettävä huoli siitä, että pakkausvaiheessa rajoja käsitellään täsmälleen samalla tavalla kuin purkuvaiheessa.

Laskentatarkkuuden säilyttämiseksi bittejä tulostetaan sitä mukaa kun päätös niistä pystytään tekemään. Toisin sanoen, jos yläraja on enintään puoli tai alaraja vähintään puoli, voidaan tulostaa bitti. Samalla rajat skaalataan kahdella.

Periaatteessa on mahdollista, että ala- ja yläraja lähestyvät mielivaltaisen lähelle puolta, mutta kumpikaan ei saavuta sitä. Tämä johtaisi laskentatarkkuuden pienenemiseen ja sen estämiseksi väli skaalataan kahdella myös, jos alaraja on vähintään 1/4 ja yläraja enintään 3/4. Tällaisten skaalausten määrä pannaan muistiin muuttujaan 'memorybits' ja otetaan huomioon, kun seuraavan kerran voidaan tulostaa bitti. Skaalauksen ansiosta välin pituus on aina suurempi kuin 1/4, joten laskentatarkkuus säilyy.

Muutama huomio koodeista

Mallit

Mallit oli osattu tehdä hyvin, mutta muutamat olivat laskeneet kuvista 'optimaaliset' parametrit erikseen vaikka työohjeessa pyydettiin käyttämään prediktiivistä jakaumaa, siis ennustamaan seuraava pikseli edellisestä käyttäen apuna mallia. MacKayn kirjan luvussa 4.2.4 on selitetty Bernoulli-mallin käyttöä aritmeettisen koodauksen yhteydessä ja kotitehtävä 2.3 käsitteli samaa asiaa. Sen lisäksi, että prediktiivisen jakauman käyttö on käytännössä yhtä helppoa, se on myös koodin pituuden mielessä optimaalista. Tehokkain tapa lähettää ensin parametrit ja sitten data olisi käyttää bits-back -tyyppistä koodausta (vaikka tuskin kukaan sitä oikeasti koodaukseen käyttää), mutta silläkin voidaan päästä enintään samaan kuin prediktiivistä jakaumaa käyttäen.

Kaikki olivat toteuttaneet kuvan kaksiulotteisuuden huomioivan mallin Markov-mallina, jonka asteluku on vähintään kaksi. Ratkaisu on helppo ja prediktiivisten jakaumien johto seuraa helpohkosti yleistyksenä Bernoulli-mallin vastaavasta (jotkut olivat ilmeisesti oikaisseet intuition avulla ja päätyneet oikeaan tulokseen). Kun siis mallin parametrien prioreina käyttää beta-jakaumia (jotka ovat näiden mallien tapauksessa konjugaattiprioreita), prediktiivinen jakauma palautuu funktioksi havaituista frekvensseistä.

Kuvista tuskin on kovin paljon priori-informaatiota. Teoreettinen epäinformatiivinen priori olisi sellainen, jossa frekvenssit alustetaan puolikkailla. On ehkä syytä olettaa, että kuvissa mustien ja valkoisten pikselien suhde olisi hiukan lähempänä puolta, joten Bernoulli-mallissa on varsin järkevää alustaa frekvenssit esimerkiksi ykkösiksi. On luultavasti syytä olettaa, että 1.-asteen Markov-mallissa mustaa pikseliä seuraa todennäköisemmin musta kuin valkoinen ja päinvastoin, joten on perusteltua alustaa frekvenssit hieman epäsymmetrisesti. Vastaava pätee 2D-mallille.

Vertailu optimaaliseen

Teoreettisesti optimaalinen symbolin koodin pituus on -log P(symboli), missä P(symboli) on nimenomaan prediktiivinen todennäköisyys. Pakkaajan esimerkkikoodi laskee myös teoreettisen optimin. Saman tuloksen toki saa, jos olettaa että parametrit pakataan käyttäen parametrien priorijakaumaa ja bits-back -tyyppistä optimaalista koodausta ja sitten pakataan data käyttäen pakattua parametria. Jos Bernoulli-mallissa olettaisi optimaalisen parametrin arvon olevan tunnettu, optimaalinen koodin pituus olisi kuvan entropia. Oletusta ei kuitenkaan siis tässä tapauksessa voi käyttää, koska parametrin kuvaukseen käytettävät bitit on otettava huomioon.

Aritmeettinen koodaus pääsee erittäin lähelle optimaalista. Esimerkkikoodi laskee optimaalisen pakkauksen olevan Lena-kuvalle n. 2362,9 bittiä ja lentokoneelle n. 1936,6 bittiä ja antaa kuville 2364 bittiä ja 1937 bittiä pitkät koodit. Jos laskentatarkkuus on kovin pieni, voidaan tietysti sattumalta saavuttaa joko optimaalista lyhyempiä tai pidempiä koodeja (keskimäärin kuitenkin pidempiä), mutta tästä ei voi mitään kovin syvällisiä johtopäätöksiä tehdä.

Hyvät tulokset eri mallien koodinpituuksille olivat 2364 ja 1937 Bernoulli-mallilla (Lena ja lentokone), 1299 ja 1364 1.-asteen Markov-mallilla ja 1106 ja 1081 2D-mallilla. Koska 1.-asteen Markov-malli ei ole kuvan 'transponoinnin' suhteen symmetrinen, voivat pituudet sitä käyttäessä olla myös luokkaa 1772 ja 1485. 2D-mallit eivät tyypillisesti ole kovin herkkiä transponoinnille ja Bernoulli-malli vielä vähemmän. Itse asiassa kaikki pikselit voisi sekoittaa mihin järjestykseen vain ja Bernoulli-mallin pitäisi antaa samat tulokset.


Tästä sivusta vastaa Harri.Lappalainen@hut.fi.
Sivua on viimeksi päivitetty 17.3.1999.
URL: http://www.cis.hut.fi/cis/edu/Tik-61.181/ac_solution.html