Laboratorium 4 - Regresja Liniowa

Ćwiczenia bazujące na materiałach Andrew Ng.
Przed zajęciami przejrzyj wykłady II-IV: Linear regression

Instrukcja w języku angielskim.

Ćwiczenia do pobrania: 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ą 5×5 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

 help eye

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

 help plot

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:

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: 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.

pl/dydaktyka/ml/lab4.txt · ostatnio zmienione: 2019/06/27 15:50 (edycja zewnętrzna)
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