Program:
V první části semestru (rozpoznávání, NN, SVM) budeme ve cvičení pracovat téměř výhradně s MATLABem. Je proto důležité, abyste si osvojili/obnovili znalosti jeho syntaxe a základní příkazy. K rychlému osvěžení můžete použít tento stručný
help
a doc
).
Dobře pracovat s MATLABem se ale naučíte pouze praxí, proto následující pomocné funkce berte i jako takovou rozcvičku.
Po tomto cvičení byste měli mít naimplementovány všechny zde zmíněné funkce. Implementace těchto funkcí není samoúčelné cvičení, budou se nám hodit v dalších cvičeních. Vypracujte je samostatně, pokud se někde zaseknete, požádejte cvičícího o radu. Funkce důkladně otestujte (sami jistě přijdete na jednoduché způsoby, jak funkce otestovat).
Pravděpodobně nestihnete všechny funkce implementovat na cvičení - zbývající funkce zůstávají za domácí úkol do příštího cvičení.
Často je nutné vyjádřit úspěšnost/chybovost modelu jediným číslem. Pro klasifikační model se často používá počet neshodných predikcí nebo poměr neshodných predikcí k celkovému počtu.
Vytvořte funkci s následující hlavičkou:
function err = errRate(yt, yp)
Vstupy | yt | [1 x N] | Skutečné (pravdivé, naměřené) hodnoty závislé veličiny |
---|---|---|---|
yp | [1 x N] | Predikce (odhady) modelu | |
Výstupy | err | skalár | Poměr neshodných predikcí k celkovému počtu |
Vstupy yt
a yp
jsou vektory obsahující pouze celá čísla, která představují identifikátory jednotlivých kategorií. Ani v jednom z vektorů se nemusí vyskytovat všechny kategorie; za množinu všech kategorií nicméně považujte sjednocení kategorií uvedených v obou vektorech (prozkoumejte funkci unique()
).
Výstup err
je poměr neshodných predikcí:
<latex> $$ \textrm{rate} = \frac{1}{N} \sum_{i=1}^N (y_t(i) \neq y_p(i)) $$ </latex>
Zde se předpokládá, že lze sčítat logické hodnoty, tedy že číselná hodnota pro true
je 1 a pro false
0.
Pro vyjádření chyby regresního modelu je nejobvyklejší mírou MSE - střední kvadratická chyba. (Lze ale použít i jiné míry.)
Vytvořte funkci s následující hlavičkou:
function err = errMSE(yt, yp)
Vstupy | yt | [1 x N] | Skutečné (pravdivé, naměřené) hodnoty závislé veličiny |
---|---|---|---|
yp | [1 x N] | Predikce (odhady) modelu | |
Výstupy | err | skalár | Střední kvadratická chyba |
Vstupy yt
a yp
jsou vektory reálných čísel.
Výstup err
je střední kvadratická chyba:
<latex> $$ MSE = \frac1N \sum_{i=1}^N (y_t(i)-y_p(i))^2 $$ </latex>
Při zjišťování úspěšnosti klasifikačního modelu je velmi vhodné sledovat, kolik objektů z třídy A bylo klasifikátorem zařazeno do třídy B, C, atd. To lze zaznamenat v matici záměn.
Vytvořte funkci errConfMatrix
s následující hlavičkou:
function cm = errConfMatrix(yt, yp)
Vstupy | yt | [1 x N] | Skutečné (pravdivé, naměřené) hodnoty závislé veličiny |
---|---|---|---|
yp | [1 x N] | Predikce (odhady) modelu | |
Výstupy | cm | [C x C] | Matice záměn (confusion matrix, misclassification matrix) |
Vstupy yt
a yp
jsou vektory obsahující pouze celá čísla, která představují identifikátory jednotlivých kategorií. Ani v jednom z vektorů se nemusí vyskytovat všechny kategorie; za množinu kategorií nicméně považujte sjednocení kategorií uvedených v obou vektorech (prozkoumejte funkci unique()
).
Výstup cm
je matice [C x C], kde C je velikost množiny kategorií. C je maximální číslo vyskytující se v yt
nebo yp
. Prvek cm(i,j)
pak bude vyjadřovat počet objektů třídy j
zařazených klasifikátorem do třídy i
.
Na příštím cvičení budeme používat metodu nejbližších sousedů, kde jistě budeme potřebovat spočítat matici vzdáleností.
Vytvořte funkci distmat
s následující hlavičkou:
function dm = distmat(x1, x2)
Vstupy | x1 | [D x N] | Matice D-rozměrných bodů; N je jejich počet |
---|---|---|---|
x2 | [D x M] | Matice D-rozměrných bodů; M je jejich počet | |
Výstupy | dm | [N x M] | Matice euklidovských vzdáleností pro všechny dvojice bodů |
Vstupy x1
a x2
jsou kolekce bodů, mezi nimiž chceme počítat vzdálenosti
Výstup dm
je matice vzdáleností. Prvek dm(i,j)
obsahuje vzdálenost mezi i-tým prvkem kolekce x1 (x1(:,i)
) a j-tým prvkem kolekce x2 (x2(:,j)
).
Budeme-li chtít rozdělit datovou sadu na trénovací a testovací data, bývá obvykle třeba rozdělit je náhodně. Je tedy třeba náhodně určit, které body budou součástí trénovací množiny a které body se stanou součástí testovací množiny. Bude také vhodné, když budeme moci specifikovat, jak velká část dat má být použita jako trénovací množina.
Vytvořte funkci randSplit
s následující hlavičkou:
function [itr, itst] = randSplit(N, trainRatio)
Vstupy | N | skalár | Počet pozorování v množině, kterou budeme dělit |
---|---|---|---|
trainRatio | skalár, (0,1) | Jaká část indexů 1..N má být umístěna do trénovací sady | |
Výstupy | itr | [1 x Ntr] | Indexy trénovacích bodů |
itst | [1 x Ntst] | Indexy testovacích bodů |
Musí platit length(itr) + length(itst) = N
a také all(unique([itr itst]) == 1:N)
.
Prozkoumejte funkci randperm()
.