FInished regression chapter for now.

This commit is contained in:
Jan Benda 2015-11-12 10:30:45 +01:00
parent 497b17227a
commit 6b3f3e4abb
7 changed files with 110 additions and 88 deletions

View File

@ -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')

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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]

View File

@ -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}