T-61.2010 Harjoitustyö #2: "K:n lähimmän naapurin luokitus"
Käytetään "k-nearest neighbour" luokintinta klassiseen iris-dataan.
Sisältö
Työn tekijä:
Opiskelija: Matti Meikäläinen
Opiskelijanumero: 12345A
Sähköpostiosoite: mmeikala@cc.hut.fi
Esitiedot
Tehtävää varten on hyvä lukea luentokalvojen luvun 6 "Hahmontunnistuksen perusteita" materiaali, paperilaskarien H3 tehtävä 3 liittyen kNN-luokittimeen sekä kerrata matriisilaskun perusteet ja tutustua Matlabin käyttöön.
Tehtäväkuvaus
Tämän tehtävän tarkoituksena on demota luennoilla esitettyä lähimmän naapurin luokitinta. Aineistona on klassinen Iris-data eli kolmen eri liljakasvin terä- ja aluslehtien pituudet ja leveydet.
Työtä varten jokaiselle opiskelijalle on kurssin www-sivuilla oma Matlab-tiedosto, josta ladataan 60 näytteen opetusjoukko sTrainD ja noin 30-60 luokiteltavaa näytettä testijoukossa sTestD. Datassa on kolmen eri luokan (liljalajin) olioita, kutakin opetusjoukossa 20 ja testijoukossa 10-20. HUOM! Luokiteltaessa uusi näytteitä ei oikeasti tiedetä niiden luokkaa. Nyt testijoukon näytteiden luokka tunnetaan, jotta luokitteluvirhe voidaan laskea.
Tehtävänä on:
- (1) tarkastella dataa ja piirtää selventäviä kuvaajia. Erottuvatko kolme eri luokkaa datasta suoraan, ts. lehtiensä koon avulla?
- (2) laskea kunkin luokiteltavan (testattavan) datapisteen x euklidinen etäisyys kaikista opetusdatan datapisteistä.
- (3) tehdä luokittelu ottamalla K lähintä naapuria opetusjoukosta ja luokittemalla x siihen luokkaan, mihin enemmistö kuuluu. Valitse joku pieni (pariton) K.
- (4) laskea väärinluokituksen prosenttiosuus, kun kaikki 30-60 testivektoria x on käyty läpi. Tässä tapauksesa testiaineistosta tiedettiin, mikä on oikea luokka, eli voidaan katsoa, oliko luokittimen antama luokitus oikein vai väärin.
- (5) kokeilla samaa vielä toisella K:n arvolla.
- (6) vastata pohdintaosiossa oleviin kysymyksiin.
Asiaa on käsitelty luvussa 6 "Hahmontunnistuksen perusteita". Avainsanoja ovat "K-nearest neighbour/neighbor", "Classifier".
Työ tehdään ja dokumentointi palautetetaan yksin oman datasetin pohjalta. Keskustelutasolla 1-3 hengen ryhmät voivat olla hyödyllisimpiä. Koodin kopiointi on kielletty T-osaston vilppitapausten toimintaohjeen mukaisesti: http://tieto.tkk.fi/vilppitoimintaohje.html
Dokumentointi
Tästä työstä tulee palauttaa dokumentti ja koodi sähköpostin liitteenä viimeistään 15.1.2008 sähköpostiosoitteeseen vvi@cis.hut.fi . Sähköpostin otsikoksi: "T-61.2010 harjoitustyo #2 OPNRO", jossa OPNRO korvataan omalla opiskelijanumerolla.
Viestissä pitää olla kaksi liitetiedostoa, joista ensimmäisessä liitteessä tulee olla työstä kirjoitettu dokumentti. Siitä pitää käydä ilmi työn tekijä, opiskelijanumero ja sähköpostiosoite, lyhyt selostus työn vaiheista ja tulokset kuvina. Mahdollinen yhteistyö sekä lähteet tulee mainita. Lopussa tulee vastata pohdintaosan (8) kysymyksiin. Tiedoston pitää olla PDF-muodossa ja nimetty muotoon "DT2007_HT2_doc_<opnro>.pdf" eli esimerkiksi "DT2007_HT2_doc_12345A.pdf".
Toisessa liitteessä on käytetty Matlab-koodi yhdessä ajokelpoissa tiedostossa (pääte .m), jonka muoto "DT2007_HT2_m_<opnro>.m", kuten yllä.
Matlabin funktiota datan käsittelyyn
Vinkkejä Matlabin yleiseen käsittelyyn löytyy myös kurssin tietokoneharjoituksista T#3 sekä Internetistä (vaikkapa hakusanoilla "site:tkk.fi Matlab")
Kurssin www-sivulta löytyy myös apufunktioita:
- myKnnClass.m: kun tälle annetaan valmiiksi laskettu etäisyysvektori luokiteltavasta (testi)pisteestä kaikkiin opetuspisteisiin (60 x 1), K:n arvo ja luokiteltavan (testi)vektorin tunnettu oikea luokka, niin se palauttaa k-NN luokittimen tuloksen, oliko luokitus oikein vai väärin.
Matriisien käsittelyyn ja analysointiin:
- help apua kuhunkin komentoon
- doc laajempi dokumentaation komentoihin
- size matriisin koko
- min, max, sort minimi, maksimi ja järjestäminen
- sum vektorin summa alkioittain
- hist piirtää histogrammin
- reshape matriisin koon muokkaaminen
- repmat matriisin kopioiminen
- for i = [1:4], i*i, end; for-silmukka
- if (i==4), j=0, else, j=1, end; if-rakenne
- disp kirjoittaa siististi näytölle
- num2str muuttaa numeron tekstiksi
Datan piirtämiseen komentoja:
- figure uusi ikkuna, figure(Z) avaa/aktivoi ikkunan Z
- plot peruskomento piirtämiseen
- hold on samaan ikkunaan monta plot-komentoa
- clf puhdistaa ikkunan
- close all sulkee kaikki ikkunat
- subplot monta kuvaajaa samaan ikkunaan
- title otsikko kuvalla
- xlabel, ylabel akseleille nimet
- legend lisää laatikon, johon voi antaa käyriä vastavat nimet
- text lisää tekstiä kuvaajaan
- grid on lisää verkon päälle
- print kuvan tallettaminen .png, .eps, .jpg, .tif, ...
- saveas kuvan tallettaminen .png, .eps, .jpg, .tif, ...
Datatiedosto
Hae oma henkilökohtainen datatiedosto XXXXXY.mat (Aihe #2) osoitteesta http://www.cis.hut.fi/Opinnot/T-61.2010/Harjoitustyo/.
Datatiedosto perustuu klassiseen Iris-dataan, jossa 150 näytettä kolmesta luokasta (liljalaji). Datan dimensio on neljä - datajoukkoon on mitattu:
- aluslehden pituus ('Sepal length')
- aluslehden leveys ('Sepal width')
- terälehden pituus ('Petal length')
- terälehden leveys ('Petal width')
kts. esim. http://en.wikipedia.org/wiki/Sepal. Näin on saatu neljä mittausta jokaisesta kukasta ja datamatriisi on (N x 4).
Mittauksia on tehty kolmesta eri lähekkäisestä liljalajista 'Setosa', 'Versicolor' ja 'Virginica'.
Tätä työtä varten joukko on jaettu kahteen osaan. Opetusosassa sTrainD on 60 näytettä ja luokiteltavassa testiosassa sTestD on noin 30-60 näytettä. Data on jaettu niin, että ensimmäiset 20 näytettä opetusaineistossa kuuluvat luokkaan 'Setosa', seuraavat 20 'Versicolor' ja viimeiset 20 'Virginica'. Testijoukossa lajit ovat sekaisin. Jokaisella opiskelijalla on käytännössä hieman eri datasetti.
Molemmat muuttujat ovat Matlabin strukteja. Struktin osiin pääsee käsiksi seuraavalla tavalla: sTrainD sisältää kaksi muuttujaa (kuten sTestD), sTrainD.data sisältää datasetin (60x4) ja sTrainD.label sisältää solurakenteen (60x1), jossa oikea luokkanimi kullekin näytteelle. Esimerkiksi sTrainD.data(25,3) on 25:nnen kukan 3. muuttuja. Kukan oikea luokka ('Versicolor') löytyy sTrainD.label{25}, huomaa aaltosulut!
Esimerkkiajo
(1) Datamatriisin tarkastelu Matlabissa
Haetaan oma tiedosto XXXXXY.mat (Aihe #1) osoitteesta http://www.cis.hut.fi/Opinnot/T-61.2010/Harjoitustyo/. (HUOM! Jos tiedostoa ei ole olemassa, mailaa Ville.Viitaniemi () tkk.fi, kirjoita viestiin opiskelijanumerosi ja pyydä tiedostoa.)
Luetaan tiedosto komennolla load. Näin on saatu kaksi muuttujaa sTrainD ja sTestD.
Voit tutustua dataan kirjoittamalla Matlabiin sTrainD ja painamalla "enter". Seuraavaksi sTrainD.data ja "enter". Ja vielä sTrainD.label ja "enter", sekä vastaavat toiselle joukolle.
Ensimmäisen muuttujan, aluslehden pituus (Sepal length), kaikki arvot saadaan sTrainD.data(:,1); 'Versicolor'-kukan terälehden leveydet (Petal width) saadaan taas sTrainD.data(21:40, 4), koska 'Versicolor' on näytteissä 21..40. plot-komennolla voidaan visualisoida dataa. Datahistogrammi eli lukujen "jakauma" saadaan komennolla hist. Näistä esimerkki erikseen täällä.
(2) Etäisyys
Lasketaan euklidinen etäisyys jokaisesta luokiteltavasta pisteestä jokaiseen opetuspisteeseen, yhteensä (60 x M) etäisyyttä. Esimerkiksi 4D-pisteiden [5.1000 3.5000 1.4000 0.2000] ja [5.5000 2.4000 3.7000 1.0000] välinen (neliöllinen) etäisyys on E = (5.1-5.5)^2 + (3.5-2.4)^2 + (1.4-3.7)^2 + (0.2-1.0)^2 = 7.3 (koska haetaan jatkossa suuruuden perusteella lähimpiä, niin ei tarvitse välttämättä ottaa neliöjuurta).
(3) K-nearest neighbour
Valitaan joku K:n arvo ja luokitellaan testinäyteet. Kohtiin (3) ja (4) voi käyttää ylempänä tarjottua funktiota myKnnClass.m.
(4) Luokitteluvirhe
Lasketaan luokitteluvirhe. Esimerkiksi:
K=1. Virhe: 3.3333%
(5) Toinen K:n arvo
Valitaan joku toinen K:n arvo ja toista kokeilu. Esimerkiksi:
K=5. Virhe: 5%
(6) Pohdinnat
Pohdi seuraavia kohtia dokumentissasi:
- Miten kolme lajia erottuivat toisistaan, 'Setosa', 'Versicolor' ja 'Virginica'?
- Mitkä muuttujat ('Sepal length', 'Sepal width', 'Petal length', 'Petal width') erottivat lajeja toisistaan?
- Millaisia luokitteluvirheitä sait eri K:n arvoilla? Miten K:n vaihtelu vaikuttaa tulokseen ja laskentaan yleisesti?
- Miten muuten voisit luokitella aineiston? Mikä olisi helpoin tapa luokitella erottuvin lajiryhmä (tietenkin mahdollisimman oikein)?
- Kuvittele vielä data-aineisto, jossa yhden muuttujan arvot vaihtelevat (vaikkapa tasavälisesti) 20 ja 200 metrin välillä ja toisen muuttujan arvot välillä 0.35 mm ja 0.94 mm:. Mitä ongelmia voisi tulla esille (esim. kun lasket etäisyyksiä eri pisteiden välille)? Miten voisit selvittää tilanteen?