Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

pl:dydaktyka:ml:lab5 [2017/07/17 10:08]
pl:dydaktyka:ml:lab5 [2019/06/27 15:50] (aktualna)
Linia 1: Linia 1:
 +====== Laboratorium 5 - Regresja Logistyczna ======
 +Ćwiczenia bazujące na materiałach Andrew Ng.\\
 +Przed zajęciami przejrzyj wykłady VI-VII: [[https://​class.coursera.org/​ml/​lecture/​preview|Logistic regression]] ​
 +
 +{{:​pl:​dydaktyka:​ml:​ex2.pdf|Instructions}} in English.
 +
 +Ćwiczenia do pobrania (files to download): {{:​pl:​dydaktyka:​ml:​logistic-regression.zip|}}
 +
 +===== Lista i opis plików =====
 +Pliki oznaczone znakiem wykrzyknika (:!:) należy wypełnić własnym kodem
 +
 +  * //ex2.m// - Skrypt Octave, który pomaga w przejściu pierwszej części laboratorium
 +  * //​ex2_reg.m//​ - Skrypt Octave, który pomaga w przejściu pierwszej części laboratorium
 +  * //​ex2data1.txt//​ - Training set for the rst half of the exercise
 +  * //​ex2data2.txt//​ - Training set for the second half of the exercise
 +  * //​mapFeature.m//​ - Function to generate polynomial features
 +  * //​plotDecisionBounday.m//​ - Function to plot classi er'​s decision boundary
 +  * //​plotData.m//​ - Function to plot 2D classi cation data
 +  * :!: //​sigmoid.m//​ - funkcja sigmoidalna
 +  * :!: //​costFunction.m//​ -funkcja kosztu dla regresji logistycznej
 +  * :!: //​predict.m//​ - funkcja klasyfikująca
 +  * :!: costFunctionReg.m - zregularyzowana funkcja kosztu dla regresji logistycznej
 +
 +===== Wstęp =====
 +W tej części laboratorium będziemy budować model regresji logistycznej,​ który pozwoli przewidywać czy kandydat na studia zostanie przyjęty, czy odrzucony.
 +
 +Zakładając że chcesz ustalić szanse dostania się na studia bazując na wynikach dwóch egzaminów. Masz dostępne dane historyczne w postaci wyników z poprzednich lat i związanej z nimi decyzji: przyjęty/​nieprzyjęty.
 +
 +Twoim zadaniem jest zbudowanie klasyfikatora,​ który oszacuje prawdopodobieństwo przyjęcia danego kandydata na studia w zależności od wyników dwóch egzaminów.
 +
 +Wykres obrazujący dane historyczne przedstawiony jest poniżej. ​
 +Żółte kropki oznaczają odrzucone kandydatury,​ a czarne krzyżyki przyjętych studentów. Na osiach przedstawione są punkty z danego egzaminu.
 +
 +{{:​pl:​dydaktyka:​ml:​plot-data-lr1.png|Dane historyczne o przyjęciach na studiach}}
 +
 +===== Sigmoid Function =====
 +Funkcja hipotezy dla regresji logistycznej wygląda w sposób następujący:​
 +$$h_0(x) = g(\theta^Tx)$$
 +Funkcja g jest funkcją sigmoidalną,​ określoną wzorem:
 +$$g(z) = \frac{1}{1+e^{-z}}$$
 +
 +Funkcja sigmoidalna została przedstawiona na rysunku poniżej.
 +Uzupełnij kod pliku //​sigmoid.m//​ tak aby można wyznaczała ona wartość funkcji sigmoidalnej. Możesz spróbować wyrysować funkcję sigmoidalną przy pomocy zaimplementowanej funkcji. Powinna ona wyglądać tak jak poniżej.
 +
 +{{:​pl:​dydaktyka:​ml:​sigmoid-lr2.png|Funkcja sigmoidalna}}
 +
 +**Uwaga** Funkcja powinna działać także dla wektorów i macierzy!
 +
 +**Uwaga** W przypadku macierzy/​wektora funkcja powinna wyznaczyć wartość funkcji sigmoidalnej dla każdego elementu z osobna.
 +
 +Przetestuj działanie funkcji za pomocą skryptu //check.m//
 +===== Cost Function =====
 +Funkcja kosztu dla regresji logistycznej wygląda następująco:​
 +$$J(\theta) = \frac{1}{m}\sum\limits_{i=1}^m(-y^{(i)}log(h_\theta(x^{(i)})) - (1 - y^{(i)})log(1-h_\theta(x^{(i))})))$$
 +
 +Natomiast gradient funkcji kosztu to wektor o tych samych wymiarach co wektor $\theta$, gdzie $j$-ty element (dla $j=0,​1,​...,​n$) jest zdefiniowany jako:
 +$$\frac{\partial J(\theta)}{\partial\theta_j}= \frac{1}{m}\sum\limits_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})x^{(i)}_j$$
 +
 +Zaimplementuj funkcję znajdującą się w pliku //​costFunction.m//​ i przetestuj jej działanie za pomocą skryptów //check.m// i //​ex2.m//​. ​
 +
 +=====Gradient Descent =====
 +Na poprzednich laboratoriach implementowaliśmy funkcję gradient descent, która krok po kroku aktualizowała współczynniki $\theta$. ​
 +
 +W tym laboratorium skorzystamy z wbudowanej w Octave funkcji //​fminunc//​.
 +Otwórz plik //ex2.m// i obejrzyj kod w okolicach linii 77-87 aby zobaczyć w jaki sposób korzysta się z tej funkcji.
 +===== Predict =====
 +Dzięki wyznaczonym parametrom jesteśmy w stanie obliczyć prawdopodobieństwo dostania się na studia. Dla przykładu prawdopodobieństwo że student, który uzyskał 45 punktów z pierwszego egzaminu i 85 punktów z drugiego zostanie przyjęty na uczelnię wynosi 0.776.
 +
 +Nam zależy jednak na tym aby otrzymać jednoznaczną odpowiedź //tak// lub //nie//. W tym celu uzupełnij funkcję //​predict.m//​. Powinna ona zwracać 1, gdy wartość funkcji hipotezy jest większe bądź równe 0.5 i 0 w przeciwnym wypadku.
 +
 +Przetestuj działanie funkcji za pomocą skryptu //check.m//
 +===== Regularized Cost Function =====
 +Regularyzacja pomaga zwalczyć problem tzw. //​overfittingu//​ danych, który pojawia się gdy do uczenia wykorzystujemy zbyt wiele parametrów przy jednoczesnej niewielkiej ilości przykładów uczących. //​Overfitting//​ skutkuje nadmiernym dopasowaniem do danych uczących i utrata pewnej generalizacji. Efektem //​Overfittingu//​ jest to, że algorytm idealnie działa na zbiorze uczącym, natomiast bardzo niedokładnie klasyfikuje dane ze zbioru testowego - zobacz rysunek poniżej.
 +
 +{{:​pl:​dydaktyka:​ml:​overfit-lr3.png|Overfitting}}
 +
 +Parametrem, który pozwala na regularyzację jest parametr $\lambda$. W zależności od jego wartości możemy skutecznie zlikwidować problem overfittingu. Jednak zwiększając nieodpowiedzialnie wartość tego parametru możemy doprowadzić do sytuacji, w której algorytm uczący nie będzie dobrze klasyfikował nawet danych treningowych - zobacz rysunek poniżej.
 +
 +{{:​pl:​dydaktyka:​ml:​underfit-lr4.png|}}
 +
 +Funkcja kosztu uwzględniająca regularyzację określona jest następującym wzorem:
 +$$J(\theta) = (\frac{1}{m}\sum\limits_{i=1}^m(-y^{(i)}log(h_\theta(x^{(i)})) - (1 - y^{(i)})log(1-h_\theta(x^{(i))}))))+\frac{\lambda}{2m}\sum\limits_{j=2}^n\theta_j^2$$
 +
 +**Uwaga** Nie normalizujemy parametru $\theta_0$ :!: W Octave indeksy zaczynają się od 1, dlatego parametr, który powinien zostać pominięty to //​theta(1)//​. Gradient w takim wypadku przedstawia się następująco:​
 +
 +**Dla** $j=0$
 +$$\frac{\partial J(\theta)}{\partial\theta_0}= \frac{1}{m}\sum\limits_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})x^{(i)}_j$$
 +
 +**Dla** $j\geq1$
 +$$\frac{\partial J(\theta)}{\partial\theta_j}= (\frac{1}{m}\sum\limits_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})x^{(i)}_j)+\frac{\lambda}{m}\theta_j$$
 +
 +Sprawdź swoją implementację za pomocą skryptu //​ex2_reg.m//​ oraz //​check.m//​.
 +
 +**Uwaga** Otwórz plik //​ex2_reg.m//​ i przetestuj działanie algorytmu zmieniając wartość współczynnika $\lambda$ w okolicach linii 90. 
 +
  
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0