From 6b3f3e4abb40ff942344ed6ec205668b0b9fd5c0 Mon Sep 17 00:00:00 2001 From: Jan Benda Date: Thu, 12 Nov 2015 10:30:45 +0100 Subject: [PATCH] FInished regression chapter for now. --- regression/code/errorGradient.m | 11 +- regression/code/errorSurface.m | 2 +- regression/code/lsqError.m | 12 +- regression/code/lsqGradient.m | 12 +- regression/lecture/figures/error_gradient.pdf | Bin 30541 -> 18532 bytes regression/lecture/gradient.py | 2 +- regression/lecture/regression.tex | 159 ++++++++++-------- 7 files changed, 110 insertions(+), 88 deletions(-) diff --git a/regression/code/errorGradient.m b/regression/code/errorGradient.m index 5a5998b..ac484ec 100644 --- a/regression/code/errorGradient.m +++ b/regression/code/errorGradient.m @@ -1,4 +1,3 @@ -clear load('lin_regression.mat') ms = -1:0.5:5; @@ -23,9 +22,9 @@ hold on %surface(M,N, error_surf, 'FaceAlpha', 0.5); contour(M,N, error_surf, 50); quiver(M,N, gradient_m, gradient_n) -xlabel('slope') -ylabel('intercept') -zlabel('error') -set(gcf, 'paperunits', 'centimeters', 'papersize', [15, 12.5], ... - 'paperposition', [0., 0., 15, 12.5]) +xlabel('Slope m') +ylabel('Intercept b') +zlabel('Mean squared error') +set(gcf, 'paperunits', 'centimeters', 'papersize', [15, 10.5], ... + 'paperposition', [0., 0., 15, 10.5]) saveas(gcf, 'error_gradient', 'pdf') \ No newline at end of file diff --git a/regression/code/errorSurface.m b/regression/code/errorSurface.m index ba3b7fe..4bd3fd2 100644 --- a/regression/code/errorSurface.m +++ b/regression/code/errorSurface.m @@ -6,7 +6,7 @@ intercepts = -30:1:30; error_surf = zeros(length(slopes), length(intercepts)); for i = 1:length(slopes) for j = 1:length(intercepts) - error_surf(i,j) = lsqError(x, y, [slopes(i), intercepts(j)]); + error_surf(i,j) = lsqError([slopes(i), intercepts(j)], x, y); end end diff --git a/regression/code/lsqError.m b/regression/code/lsqError.m index 3ba0974..3547266 100644 --- a/regression/code/lsqError.m +++ b/regression/code/lsqError.m @@ -1,13 +1,13 @@ -function error = lsqError(x, y, parameter) +function error = lsqError(parameter, x, y) % Objective function for fitting a linear equation to data. % -% Arguments: x, the input values -% y, the corresponding measured output values -% parameter, vector containing slope and intercept +% Arguments: parameter, vector containing slope and intercept % as the 1st and 2nd element +% x, vector of the input values +% y, vector of the corresponding measured output values % % Returns: the estimation error in terms of the mean sqaure error -y_est = x .* parameter(1) + parameter(2); -error = meanSquareError(y, y_est); + y_est = x .* parameter(1) + parameter(2); + error = meanSquareError(y, y_est); end diff --git a/regression/code/lsqGradient.m b/regression/code/lsqGradient.m index 2736370..4041d9e 100644 --- a/regression/code/lsqGradient.m +++ b/regression/code/lsqGradient.m @@ -1,17 +1,17 @@ -function gradient = lsqGradient(x, y, parameter) +function gradient = lsqGradient(parameter, x, y) % The gradient of the least square error % -% Arguments: x, the input values -% y, the corresponding measured output values -% parameter, vector containing slope and intercept +% Arguments: parameter, vector containing slope and intercept % as the 1st and 2nd element +% x, vector of the input values +% y, vector of the corresponding measured output values % % Returns: the gradient as a vector with two elements h = 1e-6; % stepsize for derivatives - partial_m = (lsqError(x, y, [parameter(1)+h, parameter(2)]) - lsqError(x, y, parameter))/ h; -partial_n = (lsqError(x, y, [parameter(1), parameter(2)+h]) - lsqError(x, y, parameter))/ h; + partial_m = (lsqError([parameter(1)+h, parameter(2)], x, y) - lsqError(parameter, x, y))/ h; + partial_n = (lsqError([parameter(1), parameter(2)+h], x, y) - lsqError(parameter, x, y))/ h; gradient = [partial_m, partial_n]; end diff --git a/regression/lecture/figures/error_gradient.pdf b/regression/lecture/figures/error_gradient.pdf index 159c684a7f3e70d56d99c0269a3a02efff401e0c..38d9fca92f8e4fc6270f6bf3daf5dc0f9c08fbec 100644 GIT binary patch literal 18532 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 literal 30541 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 QqpheIfR$BIO9}A*007f9qW}N^ diff --git a/regression/lecture/gradient.py b/regression/lecture/gradient.py index b762217..5f1d35c 100644 --- a/regression/lecture/gradient.py +++ b/regression/lecture/gradient.py @@ -22,7 +22,7 @@ ax.set_xlabel('x') ax.set_ylabel('y', rotation='horizontal') ax.set_xticks(np.arange(x1, x2+0.1, 1.0)) ax.set_yticks(np.arange(x1, x2+0.1, 1.0)) -ax.contour(X, Y, Z, zorder=0) +ax.contour(X, Y, Z, linewidths=2, zorder=0) # gradients: xxg = [-1.1, 1.4, -1.0] diff --git a/regression/lecture/regression.tex b/regression/lecture/regression.tex index 4985637..061f979 100644 --- a/regression/lecture/regression.tex +++ b/regression/lecture/regression.tex @@ -63,7 +63,7 @@ unabh\"angig ob sie \"uber oder unter der Gerade liegen. Statt der Summe k\"onnen wir genauso gut fordern, dass der \emph{mittlere} Abstand \begin{equation} \label{meanabserror} - e(\{(x_i, y_i)\}|\{y^{est}_i\}) = \frac{1}{N} \sum_{i=1}^N |y_i - y^{est}_i| + f_{dist}(\{(x_i, y_i)\}|\{y^{est}_i\}) = \frac{1}{N} \sum_{i=1}^N |y_i - y^{est}_i| \end{equation} der Menge der $N$ Datenpaare $(x_i, y_i)$ gegeben die Modellvorhersagen $y_i^{est}$ klein sein soll. @@ -73,7 +73,7 @@ Am h\"aufigsten wird jedoch bei einem Kurvenfit der \determ{mittlere \enterm{mean squared error}) \begin{equation} \label{meansquarederror} - e(\{(x_i, y_i)\}|\{y^{est}_i\}) = \frac{1}{N} \sum_{i=1}^N (y_i - y^{est}_i)^2 + f_{mse}(\{(x_i, y_i)\}|\{y^{est}_i\}) = \frac{1}{N} \sum_{i=1}^N (y_i - y^{est}_i)^2 \end{equation} verwendet (\figref{leastsquareerrorfig}). Wie beim Betrag sind die quadratischen Abst\"ande immer positiv, unabh\"angig ob die Datenwerte @@ -90,7 +90,7 @@ zus\"atzlich gro{\ss}e Abst\"ande st\"arker gewichtet. \section{Zielfunktion} -$e(\{(x_i, y_i)\}|\{y^{est}_i\})$ ist eine sogenannte +$f_{cost}(\{(x_i, y_i)\}|\{y^{est}_i\})$ ist eine sogenannte \determ{Zielfunktion}, oder \determ{Kostenfunktion} (\enterm{objective function}, \enterm{cost function}), da wir die Modellvorhersage so anpassen wollen, dass der mittlere quadratische Abstand, also die @@ -117,15 +117,14 @@ Abstand sein. Je nach Problemstellung kann die Kostenfunktion eine beliebige Funktion sein, die die Parameter eines Modells auf einen Wert abbildet, der in irgendeiner Weise die Qualit\"at des Modells quantifiziert. Ziel ist es dann, diejenigen Parameterwerte zu finden, -bei der die Kostenfunktion --- oder eben ``Zielfunktion'' --- -minimiert wird. +bei der die Kostenfunktion minimiert wird. %%% Einfaches verbales Beispiel? Wenn wir nun in unsere Gleichung \eqref{meansquarederror} f\"ur die Modellvorhersage $y^{est}$ die Geradengleichung einsetzen, erhalten wir f\"ur die Zielfunktion \begin{eqnarray} - e(\{(x_i, y_i)\}|m,b) & = & \frac{1}{N} \sum_{i=1}^N (y_i - f(x_i;m,b)^2 \label{msefunc} \\ + f_{cost}(\{(x_i, y_i)\}|m,b) & = & \frac{1}{N} \sum_{i=1}^N (y_i - f(x_i;m,b))^2 \label{msefunc} \\ & = & \frac{1}{N} \sum_{i=1}^N (y_i - m x_i - b)^2 \label{mseline} \end{eqnarray} den mittleren quadratischen Abstand der Datenpaare $(x_i, y_i)$ @@ -137,11 +136,11 @@ der Fehler \eqnref{mseline} minimal wird. Implementiere die Zielfunktion f\"ur die Optimierung mit der linearen Geradengleichung als Funktion \code{lsqError}. \begin{itemize} - \item Die Funktion \"ubernimmt drei Argumente: Das erste ist ein - Vektor mit den $x$-Werten, an denen gemessen wurde, und das zweite - ein Vektor mit den zugeh\"origen $y$-Werten. Das dritte Argument + \item Die Funktion \"ubernimmt drei Argumente: Das erste Argument ist ein 2-elementiger Vektor, der die Parameter \code{m} und - \code{b} enth\"alt. + \code{b} enth\"alt. Das zweite ist ein Vektor mit den $x$-Werten, + an denen gemessen wurde, und das dritte ein Vektor mit den + zugeh\"origen $y$-Werten. \item Die Funktion gibt als Ergebniss den Fehler als mittleren quadratischen Abstand \eqnref{mseline} zur\"uck. \item Die Funktion soll die Funktion \code{meanSquareError} der @@ -155,10 +154,15 @@ der Fehler \eqnref{mseline} minimal wird. Die beiden Parameter $m$ und $b$ der Geradengleichung spannen eine F\"ache auf. F\"ur jede Kombination aus $m$ und $b$ k\"onnen wir den Wert der Zielfunktion, hier der mittlere quadratische Abstand -\eqnref{meansquarederror}, berechnen. Es gibt also f\"ur jeden Punkt -in der sogenannten \emph{Fehlerfl\"ache} einen Fehler. In diesem -Beispiel eines 2-dimensionalen Problems (zwei freie Parameter) kann -die Fehlerfl\"ache graphisch durch einen 3-d ``surface-plot'' +\eqnref{meansquarederror}, berechnen. Wir betrachten also die +Kostenfunktion $f_{cost}(\{(x_i, y_i)\}|m,b)$ nun als Funktion +$f_{cost}(m,b)$, die die beiden Variablen $m$ und $b$ auf einen +Fehlerwert abbildet. + +Es gibt also f\"ur jeden Punkt in der sogenannten +\emph{Fehlerfl\"ache} einen Fehlerwert. In diesem Beispiel eines +2-dimensionalen Problems (zwei freie Parameter) kann die +Fehlerfl\"ache graphisch durch einen 3-d \enterm{surface-plot} dargestellt werden. Dabei werden auf der $x$- und der $y$-Achse die beiden Parameter und auf der $z$-Achse der Fehlerwert aufgetragen (\figref{errorsurfacefig}). @@ -197,7 +201,7 @@ rechenintensiv, da f\"ur jede m\"ogliche Kombination der Parameter der Fehler berechnet werden muss. Die Anzahl der n\"otigen Berechnungen steigt exponentiell mit der Anzahl der Parameter (``Fluch der Dimension''). Auch eine bessere Genauigkeit, mit der das Minimum -bestimmt werden soll erh\"oht die Anzahl der n\"otigen +bestimmt werden soll, erh\"oht die Anzahl der n\"otigen Berechnungen. Wir suchen also ein Verfahren, dass das Minimum der Kostenfunktion mit m\"oglichst wenigen Berechnungen findet. @@ -206,16 +210,27 @@ Kostenfunktion mit m\"oglichst wenigen Berechnungen findet. \hfill \begin{minipage}[b]{0.63\textwidth} Der Differenzenquotient - \[ m = \frac{f(x + \Delta x) - f(x)}{\Delta x} \] einer Funktion $y = f(x)$ ist - die Steigung der Sekante (rot) durch die beiden Punkte $(x,f(x))$ und - $(x+\Delta x,f(x+\Delta x))$ mit dem Abstand $\Delta x$. + \begin{equation} + \label{difffrac} + m = \frac{f(x + \Delta x) - f(x)}{\Delta x} + \end{equation} + einer Funktion $y = f(x)$ ist die Steigung der Sekante (rot) durch + die beiden Punkte $(x,f(x))$ und $(x+\Delta x,f(x+\Delta x))$ mit + dem Abstand $\Delta x$. Die Steigung einer Funktion $y=f(x)$ an einer Stelle $x$ (gelb) wird durch die Ableitung $f'(x)$ der Funktion an dieser Stelle berechnet. Die Ableitung ist \"uber den Grenzwert (orange) des Differenzenquotienten f\"ur unendlich kleine Abst\"ande $\Delta x$ definiert: - \[f'(x) = \frac{{\rm d} f(x)}{{\rm d}x} = \lim\limits_{\Delta x \to 0} \frac{f(x + \Delta x) - f(x)}{\Delta x} \] - \end{minipage} + \begin{equation} + \label{derivative} + f'(x) = \frac{{\rm d} f(x)}{{\rm d}x} = \lim\limits_{\Delta x \to 0} \frac{f(x + \Delta x) - f(x)}{\Delta x} \end{equation} + \end{minipage}\vspace{2ex} + + Numerisch kann der Grenzwert \eqnref{derivative} nicht + gebildet werden. Die Ableitung kann nur durch den + Differenzenquotienten \eqnref{difffrac} mit gen\"ugend kleinem + $\Delta x$ angen\"ahert werden. \end{ibox} \begin{ibox}[t]{\label{partialderivativebox}Partielle Ableitungen und Gradient} @@ -255,32 +270,34 @@ Kostenfunktion mit m\"oglichst wenigen Berechnungen findet. Wenn eine Kugel an einem beliebigen Startpunkt auf der Fehlerfl\"ache \figref{errorsurfacefig} losgelassen werden w\"urde, dann w\"urde sie -entlang des steilsten Gef\"alles zum Minimum der Fehlerfl\"ache rollen -und dort zum Stehen kommen. Um den Weg der Kugel mit einem -Computerprogramm nachvollziehen zu k\"onnen, ben\"otigen wir -Information \"uber die Richtung des steilsten Gef\"alles an der -jeweils aktuellen Position. +entlang des steilsten Gef\"alles auf schnellsten Wege zum Minimum der +Fehlerfl\"ache rollen und dort zum Stehen kommen (wenn sie keine +Tr\"agheit besitzen w\"urde). Den Weg der Kugel wollen wir nun als +Grundlage unseres Algorithmus zur Bestimmung des Minimums der +Kostenfunktion verwenden. Da die Kugel immer entlang des steilsten +Gef\"alles rollt, ben\"otigen wir Information \"uber die Richtung des +Gef\"alles an der jeweils aktuellen Position. Der Gradient (Box~\ref{partialderivativebox}) der Kostenfunktion -\[ \nabla e(m,b) = \left( \begin{array}{c} \frac{\partial - e(m,b)}{\partial m} \\[1ex] \frac{\partial f(m,b)}{\partial - b} \end{array} \right) \] -bzgl. der beiden Parameter $m$ und $b$ der Geradengleichung ist ein -Vektor, der in Richtung des steilsten Anstiegs der Kostenfunktion -$e(m,b)$ zeigt. Die L\"ange des Gradienten gibt die St\"arke des -Anstiegs an (\figref{gradientquiverfig})). Da wir aber abw\"arts zum -Minimum laufen wollen, m\"ussen wir die dem Gradienten -entgegengesetzte Richtung einschlagen. +\[ \nabla f_{cost}(m,b) = \left( \frac{\partial e(m,b)}{\partial m}, + \frac{\partial f(m,b)}{\partial b} \right) \] bzgl. der beiden +Parameter $m$ und $b$ der Geradengleichung ist ein Vektor, der in +Richtung des steilsten Anstiegs der Kostenfunktion $f_{cost}(m,b)$ zeigt. +Die L\"ange des Gradienten gibt die St\"arke des Anstiegs an +(\figref{gradientquiverfig})). Da wir aber abw\"arts zum Minimum +laufen wollen, m\"ussen wir die dem Gradienten entgegengesetzte +Richtung einschlagen. Die partiellen Ableitungen m\"ussen nicht analytisch berechnet werden sondern k\"onnen numerisch entsprechend dem Differenzenquotienten (Box~\ref{differentialquotientbox}) mit kleinen Schrittweiten $\Delta -m$ und $\Delta b$ angen\"ahert werden: -\[\frac{\partial e(m,b)}{\partial m} = \lim\limits_{\Delta m \to - 0} \frac{e(m + \Delta m, b) - e(m,b)}{\Delta m} \approx \frac{e(m + \Delta m, b) - - e(m,b)}{\Delta m} \; . \] +m$ und $\Delta b$ angen\"ahert werden. z.B. approximieren wir die +partielle Ableitung nach $m$ durch +\[\frac{\partial f_{cost}(m,b)}{\partial m} = \lim\limits_{\Delta m \to + 0} \frac{f_{cost}(m + \Delta m, b) - f_{cost}(m,b)}{\Delta m} \approx \frac{f_{cost}(m + \Delta m, b) - + f_{cost}(m,b)}{\Delta m} \; . \] -\begin{figure} +\begin{figure}[t] \includegraphics[width=0.75\columnwidth]{error_gradient} \titlecaption{Der Gradienten der Fehlerfl\"ache.} {Jeder Pfeil zeigt die Richtung und die @@ -293,14 +310,14 @@ m$ und $\Delta b$ angen\"ahert werden: \end{figure} \begin{exercise}{lsqGradient.m}{}\label{gradientexercise}% - Implementiere eine Funktion \code{lsqGradient}, die die $x$- und - $y$-Werte der Messdaten sowie den Parametersatz $(m, b)$ der - Geradengleichung als 2-elementigen Vektor als Argumente + Implementiere eine Funktion \code{lsqGradient}, die den + Parametersatz $(m, b)$ der Geradengleichung als 2-elementigen Vektor + sowie die $x$- und $y$-Werte der Messdaten als Argumente entgegennimmt und den Gradienten an dieser Stelle zur\"uckgibt. \end{exercise} \begin{exercise}{errorGradient.m}{} - Benutzt die Funktion aus der vorherigen \"Ubung (\ref{gradientexercise}), + Benutze die Funktion aus der vorherigen \"Ubung (\ref{gradientexercise}), um f\"ur jede Parameterkombination aus der Fehlerfl\"ache (\"Ubung \ref{errorsurfaceexercise}) auch den Gradienten zu berechnen und darzustellen. Vektoren im Raum k\"onnen mithilfe der @@ -328,7 +345,7 @@ f\"ur den Abstieg lautet: wird (z.B. \code{norm(gradient) < 0.1}). \item \label{gradientstep} Gehe einen kleinen Schritt ($\epsilon = 0.01$) in die entgegensetzte Richtung des Gradienten: - \[p_{i+1} = p_i - \epsilon \cdot \nabla e(m_i, b_i)\] + \[p_{i+1} = p_i - \epsilon \cdot \nabla f_{cost}(m_i, b_i)\] \item Wiederhole die Schritte \ref{computegradient} -- \ref{gradientstep}. \end{enumerate} @@ -339,8 +356,8 @@ solange ver\"andert, wie der Gradient eine bestimmte Gr\"o{\ss}e ist auch die Ver\"anderung der Position gro{\ss} und der Abstand der Punkte in Abbildung \ref{gradientdescentfig} gro{\ss}. -\begin{figure}[hb] - \includegraphics[width=0.6\columnwidth]{figures/gradient_descent} +\begin{figure}[t] + \includegraphics[width=0.6\columnwidth]{gradient_descent} \caption{\textbf{Gradientenabstieg.} Es wird von einer beliebigen Position aus gestartet und der Gradient berechnet und die Position ver\"andert. Jeder Punkt zeigt die Position nach jedem @@ -364,32 +381,38 @@ Punkte in Abbildung \ref{gradientdescentfig} gro{\ss}. \section{Fazit} Mit dem Gradientenabstieg haben wir eine wichtige Methode zur Bestimmung eines globalen Minimums einer Kostenfunktion -kennengelernt. F\"ur den Fall des Kurvenfits mit einer -Geradengleichung zeigt der mittlere quadratische Abstand als -Kostenfunktion in der Tat ein einziges klar definiertes Minimum. - -Wie wir im n\"achsten Kapitel sehen werden, kann die Position des -Minimums bei Geradengleichungen sogar analytisch bestimmt werden, der -Gradientenabstieg w\"are also gar nicht n\"otig -\matlabfun{polyfit}. Bei allen nichtlinearen Funktionen, wie z.B. der -Exponentialfunktion $f(x;\lambda) = \exp(\lambda x)$ gibt es aber -keine analytische L\"osung, und das Minimum der Kostenfunktion muss -numerisch, z.B. mit dem Gradientenabstiegsverfhren bestimmt werden. - -Um noch schneller das Minimum zu finden, kann der Gradientenabstieg -auf vielf\"altige Wei{\ss}e verfeinert werden. z.B. kann die -Schrittweite an die St\"arke des Gradienten angepasst werden. Diese -numerischen Tricks sind in bereits vorhandenen Funktionen -implementiert. Allgemeine Funktionen sind f\"ur beliebige +kennengelernt. + +F\"ur den Fall des Kurvenfits mit einer Geradengleichung zeigt der +mittlere quadratische Abstand als Kostenfunktion in der Tat ein +einziges klar definiertes Minimum. Wie wir im n\"achsten Kapitel +sehen werden, kann die Position des Minimums bei Geradengleichungen +sogar analytisch bestimmt werden, der Gradientenabstieg w\"are also +gar nicht n\"otig \matlabfun{polyfit}. + +F\"ur Parameter, die nichtlinear in einer Funktion +enthalten sind, wie z.B. die Rate $\lambda$ als Parameter in der +Exponentialfunktion $f(x;\lambda) = \exp(\lambda x)$, gibt es keine +analytische L\"osung, und das Minimum der Kostenfunktion muss +numerisch, z.B. mit dem Gradientenabstiegsverfahren bestimmt werden. + +Um noch schneller das Minimum zu finden, kann das Verfahren des +Gradientenabstiegs auf vielf\"altige Weise verbessert +werden. z.B. kann die Schrittweite an die St\"arke des Gradienten +angepasst werden. Diese numerischen Tricks sind in bereits vorhandenen +Funktionen implementiert. Allgemeine Funktionen sind f\"ur beliebige Kostenfunktionen gemacht \matlabfun{fminsearch}, w\"ahrend spezielle Funktionen z.B. f\"ur die Minimierung des quadratischen Abstands bei einem Kurvenfit angeboten werden \matlabfun{lsqcurvefit}. \begin{important} Das Finden des globalen Minimums ist leider nur selten so leicht wie - bei einem Geradenfit. Oft gibt es viele Nebenminima, in denen der - Gradientenabstieg enden kann, obwohl das gesuchte globale Minimum - noch weit entfernt ist. Darum ist es meist sehr wichtig, wirklich - gute Startwerte f\"ur die zu bestimmenden Parameter der - Kostenfunktion zu haben. + bei einem Geradenfit. Oft hat die Kostenfunktion viele Nebenminima, + in denen der Gradientenabstieg enden kann, obwohl das gesuchte + globale Minimum noch weit entfernt ist. Darum ist es meist sehr + wichtig, wirklich gute Startwerte f\"ur die zu bestimmenden + Parameter der Kostenfunktion zu haben. Auch sollten nur so wenig wie + m\"oglich Parameter gefittet werden, da jeder zus\"atzliche + Parameter den Optimierungsprozess schwieriger und + rechenaufw\"andiger macht. \end{important}