Laboratorium 4 - 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.
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
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:
Gdzie
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 , 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:
Uwaga 1 Zwróć uwagę, że funkcja wykorzystuje do obliczenia swojej wartości współczynniki Pamiętaj więc, żeby najpierw obliczyć uaktualnienia, a dopiero na samym końcu uaktualnić wartości współczynników .
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:
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
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
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 oraz ilość iteracji są źle dobrane.
Otwórz plik ex1_multi.m i w okolicach linii 85 dokonaj następujących modyfikacji:
Zobacz jak zmienia się wykres funkcji kosztu. Dobierz dane tak, aby wykres wyglądał tak jak poniżej:
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 mogą zostać wyznaczone bez konieczności uruchamiania algorytmu gradient descent. Wystarczy zastosować poniższe równanie:
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.