|
|
pl:dydaktyka:ml:lab4 [2013/03/21 13:08] esimon [Normal Equation] |
pl:dydaktyka:ml:lab4 [2019/06/27 15:50] |
====== Laboratorium 4 - Regresja Liniowa ====== | |
Ćwiczenia bazujące na materiałach Andrew Ng.\\ | |
Przed zajęciami przejrzyj wykłady II-IV: [[https://class.coursera.org/ml/lecture/preview|Linear regression]] | |
| |
{{:pl:dydaktyka:ml:ex1.pdf|Instrukcja}} w języku angielskim. | |
| |
Ćwiczenia do pobrania: {{:pl:dydaktyka:ml:ex1.zip|Regresja Liniowa}} | |
===== Lista i opis plików ===== | |
Pliki oznaczone znakiem wykrzyknika (:!:) należy wypełnić własnym kodem | |
* //ex1.m// - Skrypt Octave, który pomaga w przejściu pierwszej części laboratorium | |
* //ex1_multi.m// - Skrypt Octave, który pomaga w przejściu pierwszej części laboratorium | |
* :!: //warmUpExercise.m// - Ćwiczenie rozgrzewkowe | |
* :!: //plotData.m// - Funkcja rysująca wykres | |
* :!: //computeCost.m// - Funkcja kosztu dla regresji liniowej | |
* :!: //gradientDescent.m// - Funkcja uruchamiająca algorytm //Gradient Descent// | |
* :!: //computeCostMulti.m// - Funkcja kosztu dla regresji liniowej dla przypadku wielowymiarowego | |
* :!: //gradientDescentMulti.m// - Funkcja uruchamiająca algorytm //Gradient Descent// dla przypadku wielowymiarowego | |
* :!: //featureNormalize.m// - Funkcja normalizująca dane wejściowe | |
* :!: //normalEqn.m// - Funkcja dla regresji liniowej wyznaczająca parametry ze wzoru | |
| |
===== Warm Up Exercise ===== | |
Otwórz plik //warmUpExercise.m// w swoim ulubionym edytorze tekstu i w miejscu oznaczonym komentarzami wpisz kod, który wygeneruje macierz jednostkową 5x5 i zwróci ją jako wartość zwracaną funkcji. | |
$$M = \begin{bmatrix} | |
1 & 0 & 0 & 0 & 0 \\ | |
0 & 1 & 0 & 0 & 0 \\ | |
0 & 0 & 1 & 0 & 0 \\ | |
0 & 0 & 0 & 1 & 0 \\ | |
0 & 0 & 0 & 0 & 1 \\ | |
\end{bmatrix}$$ | |
| |
**Uwaga** W Octave istnieje funkcja generująca macierz jednostkową. Nazywa się //eye//. Aby dowiedzieć się więcej na temat tej funkcji wpisz w konsoli Octave <code> help eye</code> | |
| |
Kiedy poprawnie uzupełnisz kod funkcji zapisz plik i uruchom skrypt //ex1//. Testuje on działanie poszczególnych zadań i prezentuje wykorzystanie ich w //praktyce//. | |
| |
Jeśli coś nie działa, uruchom skrypt //check//. Przeprowadza on test działania poszczególnych funkcji i pokazuje poprawne wyniki. | |
===== Regresja Liniowa dla jednej zmiennej ===== | |
W tej części zajmiemy się przypadkiem regresji liniowej dla jednej zmiennej. | |
Załóżmy, że jesteśmy CEO sieci restauracji i planujemy otwarcie kilku kolejnych lokali. | |
| |
Na podstawie danych dotyczących aktualnie otwartych restauracji i zysku jaki z nich otrzymujemy chcemy wybrać miasta w których najbardziej opłaci się otwarcie inwestycji. | |
Plik //ex1data1.txt// zawiera te dane. Pierwsza kolumna zawiera populację danego miasta, druga zysk w tym mieście. Ujemne wartości oznaczają stratę. | |
==== Plot Data ==== | |
Uzupełnij plik //plotData.m// tak, aby rysowała wykres w taki sposób jak na rysunku poniżej. | |
Pamiętaj o podpisaniu osi. | |
| |
Aby dowiedzieć się więcej o funkcji plot, wpisz w konsoli Octave <code> help plot</code> | |
| |
{{:pl:dydaktyka:ml:plot1.png|Wykres danych uczących}} | |
| |
Sprawdź działanie funkcji za pomocą skryptu //ex1//. | |
==== Compute Cost ==== | |
W pierwszej kolejności zaimplementuj funkcję kosztu dla regresji liniowej (plik //computeCost.m//). | |
| |
Funkcja kosztu dana jest wzorem: | |
$$J(\theta) = \frac{1}{2m}\sum\limits_{i=1}^m(H_{\theta}(x^{(i)}})-y^{(i)}})^2$$ | |
| |
Gdzie | |
| |
$$h_{\theta}(x) = \theta^Tx = \theta_0+\theta_1x_1 $$ | |
| |
**Uwaga** Pomyśl jak zapisać kod tak, aby nie używać pętli! Dzięki temu automatycznie będzie on pasował do drugiej części zadania (Regresja liniowa z wieloma zmiennymi) | |
| |
Przetestuj działanie funkcji skryptem //check.m//. | |
==== Gradient Descent ==== | |
Ideą algorytmu Gradient Descent jest znalezienie odpowiednich współczynników $\theta$, tak aby funkcja kosztu dla danych treningowych była najmniejsza. | |
W każdym kroku algorytmu uaktualniamy zatem wartości współczynników korzystając ze wzoru: | |
$$\theta_j = \theta_j-\alpha\frac{1}{m}\sum\limits_{i=1}^{m}(h_{\theta}(x^{(i)})-y^{(i)})x_j^{(i)} $$ | |
| |
**Uwaga 1** Zwróć uwagę, że funkcja $h_{\theta}(x)$ wykorzystuje do obliczenia swojej wartości współczynniki $\theta$ :!: Pamiętaj więc, żeby najpierw obliczyć uaktualnienia, a dopiero na samym końcu uaktualnić wartości współczynników $\theta$. | |
| |
**Uwaga 2** Spróbuj zapisać kod unikając pętli - będzie on wtedy działał dla wersji z wieloma zmiennymi. | |
| |
Przetestuj działanie algorytmu regresji liniowej używając skryptów //check.m// oraz //ex1.m//. | |
| |
Powinieneś zobaczyć następujący wynik: | |
| |
{{:pl:dydaktyka:ml:plot2.png|Wynik działania algorytmu regresji liniowej}} | |
===== Regresja Liniowa dla wielu zmiennych ===== | |
Zakładamy, ze chcemy sprzedać dom, ale nie jesteśmy pewni jaką cenę ustalić. Mamy dostęp do danych o innych domach i cenach za jakie zostały sprzedane. Na tej podstawie chcemy ustalić cenę naszego domu. | |
| |
Dane dotyczące charakterystyki domów są dwuwymiarowe (a nie jak w poprzednim wypadku jednowymiarowe). Zawierają one następujące informacje: | |
* metraż domu (w stopach), | |
* ilość sypialni. | |
| |
**Uwaga** w tej części skryptem pomagającym w ukończeniu zadań jest //ex1_multi.m// oraz //check.m//. | |
==== Feature Normalization ==== | |
Dane odnośnie powierzchni domu i ilości sypialni nalezą do równych rzędów wielkości. Warto je w związku z tym znormalizować, aby zapewnić lepsze działanie algorytmowi. | |
| |
Normalizacja danych odbywa się według wzoru: | |
$$x_{norm}^{j,i} = \frac{x^{j,i}-\mu^j}{\sigma^j}$$ | |
| |
Gdzie: | |
$x^{j,i}$ jest $i-tym$ elementem ze zbioru danej cechy $j$ \\ | |
$\mu^j$ jest średnią elementów cechy $j$ \\ | |
$\sigma^j$ jest odchyleniem standardowym dla elementeów cechy $j$ | |
| |
| |
| |
Sprawdź działanie funkcji skryptem //check.m// | |
==== Compute Cost Multi ==== | |
Uzupełnij funkcję //computeCostMulti.m// dla przypadku wielowymiarowego. Pamiętaj, że funkcja nie powinna ograniczać swojego działania tylko dla danych 2-wymiarowych. | |
| |
Wektorowy zapis funkcji kosztu wygląda następująco | |
$$J(\theta) = \frac{1}{2m}(X\theta - y)^T(X\theta - y) $$ | |
| |
Przetestuj działanie funkcji skryptem //check.m// | |
| |
**Uwaga** Jeśli wykorzystałeś wektorową (bez pętli) implementację funkcji //computeCost.m// możesz przekleić kod - dobrze napisana wektorowa implementacja będzie działać dla dowolnego wymiaru danych! | |
==== Gradient Descent Multi ==== | |
| |
| |
Uzupełnij funkcję //gradientDescentMulti.m// dla przypadku wielowymiarowego. Pamiętaj, że funkcja nie powinna ograniczać swojego działania tylko dla danych 2-wymiarowych. | |
| |
Przetestuj działanie funkcji skryptem check.m | |
| |
**Uwaga** Jeśli wykorzystałeś wektorową (bez pętli) implementację funkcji //gradientDescent.m// możesz przekleić kod - dobrze napisana wektorowa implementacja będzie działać dla dowolnego wymiaru danych! | |
| |
=== Dobór współczynnika uczenia === | |
| |
| |
**Uwaga** Po uruchomieniu skryptu //ex1_multi.m// prawdopodobnie otrzymasz wykres funkcji kosztu względem ilości iteracji, który nie wyglądają poprawnie... Dzieje się tak, ponieważ współczynnik uczenia $\alpha$ oraz ilość iteracji są źle dobrane. | |
| |
Otwórz plik //ex1_multi.m// i w okolicach linii 85 dokonaj następujących modyfikacji: | |
* zmień ilość iteracji na 50 | |
* zmieniaj współczynnik $\alpha$, przypisując mu wartości: 0.3, 0.1, 0.03, etc. ($x_{i+1} = x_{i}*3$) | |
| |
Zobacz jak zmienia się wykres funkcji kosztu. Dobierz dane tak, aby wykres wyglądał tak jak poniżej: | |
{{:pl:dydaktyka:ml:plot3.png|Wykres funkcji kosztów względem liczby iteracji}} | |
| |
=== Wyznaczenie aproksymacji ceny domu === | |
| |
Teraz, kiedy współczynnik uczący został poprawnie dobrany, należy zmodyfikować plik //ex1_multi.m// w okolicach linii 104, tak aby do zmiennej //price// przypisana została aproksymowana wartość domu o powierzchni 1650 stóp kwadratowych i 3 sypialniach. | |
| |
Powinieneś otrzymać wartość, około 290000. | |
| |
**Uwaga** Pamiętaj o normalizacji danych...:) | |
| |
| |
| |
==== Normal Equation ==== | |
Wartości współczynników $\theta$ mogą zostać wyznaczone bez konieczności uruchamiania algorytmu gradient descent. Wystarczy zastosować poniższe równanie: | |
$$\theta = (X^TX)^{-1}X^Ty$$ | |
| |
Zwróć uwagę, że w tym przypadku nie jest konieczna normalizacja. | |
| |
Zmodyfikuj plik //ex1_multi.m// w okolicach linii 152, tak aby do zmiennej //price// przypisana została aproksymowana wartość domu o powierzchni 1650 stóp kwadratowych i 3 sypialniach. | |
| |
Powinieneś otrzymać wartość podobną do tej wyznaczonej w przypadku algorytmu Gradient Descent. | |
==== Uwagi ==== | |
Dużo materiału. Nie wszyscy zdążyli ze zrobieniem wszystkich zadań. Być może następnym razem opłacałoby się rozbicie tych lab na dwie części. | |
| |
| |
| |
| |