Ć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
Pliki oznaczone znakiem wykrzyknika () należy wypełnić własnym kodem
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.
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ę.
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.
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.
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:
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:
Uwaga w tej części skryptem pomagającym w ukończeniu zadań jest ex1_multi.m oraz check.m.
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:
Gdzie:
jest elementem ze zbioru danej cechy
jest średnią elementów cechy
jest odchyleniem standardowym dla elementeów cechy
Sprawdź działanie funkcji skryptem check.m
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!
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!
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:
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…:)
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.
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.