Różnice

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

Odnośnik do tego porównania

pl:dydaktyka:ml:lab4 [2013/03/21 13:08]
esimon [Normal Equation]
pl:dydaktyka:ml:lab4 [2019/06/27 15:50]
Linia 1: Linia 1:
-====== 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. 
- 
- 
- 
  
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