====== Cvičení 1 ====== Program: * Organizace cvičení * Úvod do MATLABu * Pomocné funkce ===== Úvod do MATLABu ===== 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ý * [[http://labe.felk.cvut.cz/~posik/y33aui/uvod-do-matlabu/|úvod do MATLABu]] nebo * help a dokumentaci k MATLABu (příkazy ''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. ===== Pomocné funkce ===== 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í.** ==== Chyba klasifikačního modelu (přesnost) ==== Č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í: $$ \textrm{rate} = \frac{1}{N} \sum_{i=1}^N (y_t(i) \neq y_p(i)) $$ Zde se předpokládá, že lze sčítat logické hodnoty, tedy že číselná hodnota pro ''true'' je 1 a pro ''false'' 0. ==== Chyba regresního modelu (MSE) ==== Pro vyjádření chyby regresního modelu je nejobvyklejší mírou [[wp>Mean_squared_error|MSE - střední kvadratická chyba]]. (Lze ale použít i [[wp>Errors_and_residuals_in_statistics|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: $$ MSE = \frac1N \sum_{i=1}^N (y_t(i)-y_p(i))^2 $$ ==== Matice záměn ==== 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 [[wp>Confusion_matrix|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''. ==== Matice vzdáleností ==== 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)''). ==== Náhodné rozdělení množiny indexů ==== 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()''.