Merge branch 'master' of raven.am28.uni-tuebingen.de:scientificComputing
Conflicts: programming/lecture/programming.tex
3
Makefile
@ -1,7 +1,6 @@
|
|||||||
BASENAME=scientificcomputing-script
|
BASENAME=scientificcomputing-script
|
||||||
|
|
||||||
SUBDIRS=plotting designpattern statistics bootstrap regression likelihood pointprocesses
|
SUBDIRS=programming plotting statistics bootstrap regression likelihood pointprocesses designpattern
|
||||||
# programming
|
|
||||||
SUBTEXS=$(foreach subd, $(SUBDIRS), $(subd)/lecture/$(subd).tex)
|
SUBTEXS=$(foreach subd, $(SUBDIRS), $(subd)/lecture/$(subd).tex)
|
||||||
|
|
||||||
pdf : chapters $(BASENAME).pdf
|
pdf : chapters $(BASENAME).pdf
|
||||||
|
BIN
plotting/lecture/images/plot_editor.png
Normal file
After Width: | Height: | Size: 44 KiB |
BIN
plotting/lecture/images/property_editor.png
Normal file
After Width: | Height: | Size: 42 KiB |
@ -1,6 +1,6 @@
|
|||||||
\chapter{\tr{Data plotting}{Graphische Darstellung von Daten}}
|
\chapter{\tr{Data plotting}{Graphische Darstellung von Daten}}
|
||||||
|
|
||||||
\section{Graphische Darstellung von Daten}
|
\section{Does and Don'ts bei der Graphische Darstellung von Daten}
|
||||||
|
|
||||||
Die ad\"aquate Darstellung wissenschaftlicher Daten darf man durchaus
|
Die ad\"aquate Darstellung wissenschaftlicher Daten darf man durchaus
|
||||||
zu den notwendigen Kernkompetenzen z\"ahlen. Wir brauchen sie um
|
zu den notwendigen Kernkompetenzen z\"ahlen. Wir brauchen sie um
|
||||||
@ -57,7 +57,7 @@ Beispiele (\url{https://en.wikipedia.org/wiki/Misleading_graph}).
|
|||||||
Man kann durch graphische Tricks wie Perspektive (Abbildung
|
Man kann durch graphische Tricks wie Perspektive (Abbildung
|
||||||
\ref{misleadingpiefig}) oder auch gezielte Achsenskalierungen
|
\ref{misleadingpiefig}) oder auch gezielte Achsenskalierungen
|
||||||
(Abbildung \ref{misleadingscalingfig}) den Eindruck des Betrachters
|
(Abbildung \ref{misleadingscalingfig}) den Eindruck des Betrachters
|
||||||
steuern. Insbesondere wenn die Gr ß''o{\ss}e von Symbolen zur
|
steuern. Insbesondere wenn die Gr\"o{\ss}e von Symbolen zur
|
||||||
Darstellung einer Quantit\"at eingesetzt werden, muss man mit Vorsicht
|
Darstellung einer Quantit\"at eingesetzt werden, muss man mit Vorsicht
|
||||||
vorgehen um Unterschiede nicht zu \"uberproportional zu verzerren
|
vorgehen um Unterschiede nicht zu \"uberproportional zu verzerren
|
||||||
(Abbildung \ref{misleadingsymbolsfig}).
|
(Abbildung \ref{misleadingsymbolsfig}).
|
||||||
@ -119,4 +119,134 @@ vorgehen um Unterschiede nicht zu \"uberproportional zu verzerren
|
|||||||
|
|
||||||
\newpage
|
\newpage
|
||||||
|
|
||||||
\subsection{Plottingsystem in \matlab{}}
|
\section{Plottingsystem in \matlab{}}
|
||||||
|
|
||||||
|
Plotten in \matlab{} ist zun\"achst einmal einfach. Durch den Aufruf
|
||||||
|
von \code{plot(x, y)} wird ein einfacher, schlichter Linienplot
|
||||||
|
erstellt. Zun\"achst fehlem diesem Plot jegliche Annotationen wie
|
||||||
|
Achsbeschriftungen Legenden, etc. Um diese hizuzuf\"ugen kann man zwei
|
||||||
|
Wege gehen: Das Graphische User Interface oder die
|
||||||
|
Kommandozheile. Beide haben ihre Berechtigung und Vor- und
|
||||||
|
Nachteile. W\"ahrend es bequem ist die Abbildung mit der GUI
|
||||||
|
(Abbildung \ref{ploteditorfig}) zu bearbeiten sind die erhaltenen
|
||||||
|
Ergebnisse nicht unbedingt reproduzierbar. Auch wenn eine Abbildung
|
||||||
|
korrigiert werden mus{\ss}, wird es schwierig und zeitaufwendig. Die
|
||||||
|
Nachtr\"agliche Bearbeitung der Abbildungen mit dem Graphikprogramm
|
||||||
|
seiner Wahl birgt seine eigenen Risiken. Das Bestreben sollte sein,
|
||||||
|
aus \matlab{} heraus publikationsreife Abbildungen zu erzeugen.
|
||||||
|
|
||||||
|
\begin{figure}
|
||||||
|
\begin{minipage}[t]{0.45\columnwidth}
|
||||||
|
\includegraphics[width=0.9\textwidth]{plot_editor}
|
||||||
|
\end{minipage}
|
||||||
|
\begin{minipage}[t]{0.225\columnwidth}
|
||||||
|
\includegraphics[width=0.9\textwidth]{property_editor}
|
||||||
|
\end{minipage}
|
||||||
|
\caption{\textbf{Grahischer Plot Editor.} Editor f\"ur plots. Je
|
||||||
|
nachdem welches Element des Plots ausgew\"ahlt wurde ver\"andern
|
||||||
|
sich Einstellungsm\"oglichkeiten. Weitere Eigenschaften k\"onnen
|
||||||
|
\"uber den ``Property Editor'', rechts, eingestellt werden. Der
|
||||||
|
Property Editor ist \"uber die Schaltfl\"ache ``More Properties''
|
||||||
|
erreichbar.}\label{ploteditorfig}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
Alle Einstellungen, die man \"uber das graphische Interface machen
|
||||||
|
kann sind auch \"uber Befehle auf der Kommandozeile m\"oglich. Das
|
||||||
|
heisst, dass die Einstellungen problemlos in eine Skript, eine
|
||||||
|
Funktion eingebaut werden k\"onnen. Dieser Ansatz hat den Vorteil,
|
||||||
|
dass man sich die M\"uhe nur ein mal machen muss. Unter den
|
||||||
|
h\"aufigsten Einstellungen sind:
|
||||||
|
\begin{enumerate}
|
||||||
|
\item Einstellungen der Linienplots:
|
||||||
|
\begin{itemize}
|
||||||
|
\item St\"arke und Farbe.
|
||||||
|
\item Linienstil, Marker.
|
||||||
|
\end{itemize}
|
||||||
|
\item Achsbeschriftung:
|
||||||
|
\begin{itemize}
|
||||||
|
\item \code{xlabel}, \code{ylabel}.
|
||||||
|
\item Schriftart und Gr\"o{\ss}e.
|
||||||
|
\end{itemize}
|
||||||
|
\item Achsenskalierung und Ticks:
|
||||||
|
\begin{itemize}
|
||||||
|
\item Skalierung der Achsen (Minumum und Maxmimum, logarithmisch oder linear).
|
||||||
|
\item Manuelles Setzen der Ticks, ihrer Richtung und Beschriftung.
|
||||||
|
\item Grid or no Grid?
|
||||||
|
\end{itemize}
|
||||||
|
\item Setzen von globalen Parametern:
|
||||||
|
\begin{itemize}
|
||||||
|
\item Einstellung der Papiergr\"o{\ss}e und plzieren der
|
||||||
|
Zeichenfl\"ache.
|
||||||
|
\item Soll die Zeichenfl\"ache auf allen vier Seiten von einer Box eingeschlossen sein oder nicht?
|
||||||
|
\item Speichern der Abbildung als pdf.
|
||||||
|
\end{itemize}
|
||||||
|
\end{enumerate}
|
||||||
|
|
||||||
|
Das folgende Listing \ref{niceplotlisting} zeigt das Skript, das die
|
||||||
|
Abbildung \ref{spikedetectionfig} erstellt und speichert. Abh\"angig
|
||||||
|
davon, ob man Eigenschaften der Abbildung oder der Achsen setzen will
|
||||||
|
benutzt man die \code{set} Funktion und \"ubergibt ihr ein sogenanntes
|
||||||
|
Handle der Achse oder der Abbildung und sowohl den Namen als auch den
|
||||||
|
gew\"unschten Wert der der Eigenschaft: \code{set(gcf, 'PaperUnits',
|
||||||
|
'centimeters')} setzt die Eigenschaft ``PaperUnits'' der Abbildung
|
||||||
|
auf ``centimeters'', Standard ist, nat\"urlich, ``inches''.
|
||||||
|
\code{gcf} steht f\"ur ``get current figure'' und stellt ein Handle
|
||||||
|
der aktuellen Abbildung zur Verf\"ugung. Um Eigenschaften der Achse zu
|
||||||
|
setzten benutzt man: \code{set(gca, 'linewidth', 1.5)} wobei
|
||||||
|
\code{gca} f\"ur ``get current axis'' steht. Wenn man den Namen einer
|
||||||
|
Eigenschaft nicht kennt, kann man entweder in der Hilfe nachschlagen
|
||||||
|
oder sie im ``Property Editor'' finden.
|
||||||
|
|
||||||
|
\begin{lstlisting}[caption={Skript zur Erstellung des Plots in Abbildung \ref{spikedetectionfig}.}, label=niceplotlisting]
|
||||||
|
fig = figure();
|
||||||
|
set(gcf, 'PaperUnits', 'centimeters', 'PaperSize', [11.7 9.0]);
|
||||||
|
set(gcf, 'PaperPosition',[0.0 0.0 11.7 9.0], 'Color', 'white')
|
||||||
|
hold on
|
||||||
|
plot(time, neuronal_data, 'color', [ 0.2 0.5 0.7], 'linewidth', 1.)
|
||||||
|
plot(spike_times, ones(size(spike_times))*threshold, 'ro', 'markersize', 4)
|
||||||
|
line([time(1) time(end)], [threshold threshold], 'linestyle', '--',
|
||||||
|
'linewidth', 0.75, 'color', [0.9 0.9 0.9])
|
||||||
|
ylim([0 35])
|
||||||
|
xlim([0 2.25])
|
||||||
|
box('off')
|
||||||
|
xlabel('time [s]', 'fontname', 'MyriadPro-Regular', 'fontsize', 10)
|
||||||
|
ylabel('potential [mV]', 'fontname', 'MyriadPro-Regular', 'fontsize', 10)
|
||||||
|
title('pyramidal cell', 'fontname', 'MyriadPro-Regular', 'fontsize', 12)
|
||||||
|
set(gca, 'TickDir','out', 'linewidth', 1.5, 'fontname', 'MyriadPro-Regular')
|
||||||
|
saveas(fig, 'spike_detection.pdf', 'pdf')
|
||||||
|
\end{lstlisting}
|
||||||
|
|
||||||
|
\begin{figure}
|
||||||
|
\includegraphics[width=0.5\columnwidth]{./images/spike_detection}
|
||||||
|
\caption{\textbf{Annehmbarer Plot.} Dieser Plot wurde vollst\"andig
|
||||||
|
mit dem Skript in Listing \ref{niceplotlisting} erstellt und
|
||||||
|
gespeichert.}\label{spikedetectionfig}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
|
||||||
|
Neben den Standard Linienplots gibt es eine ganze Reihe weiterer
|
||||||
|
M\"oglichkeiten Daten zu Visualisieren. Mathworks zeigt unter
|
||||||
|
\url{http://www.mathworks.de/discovery/gallery.html} viele Beispiele
|
||||||
|
mit zugeh\"origem Code.
|
||||||
|
|
||||||
|
\subsection{Fazit}
|
||||||
|
|
||||||
|
Ein guter Datenplot stellt die Daten m\"oglichst vollst\"andig und
|
||||||
|
n\"uchtern dar. Verzerrungen durch perspektivische Darstellungen,
|
||||||
|
Achs- oder Symbolskalierungen sollten vermieden werden. Wenn man
|
||||||
|
verschiedene Linienplots in einen Graphen plottet, sollte man neben
|
||||||
|
der Farbe auch den Linienstil (durchgezogen, gepunktet, gestrichelt,
|
||||||
|
etc.) variieren um auch im Schwarzweissdruck eine Unterscheidung zu
|
||||||
|
erm\"oglichen. Bei der Farbwahl sollte man auf Kombinationen aus Rot
|
||||||
|
und Gr\"un verzichten, da sie f\"ur einen nicht unwesentlichen Teil
|
||||||
|
der m\"annlichen Bev\"olkerung nicht unterscheidbar sind. Man achte
|
||||||
|
insbesondere auf:
|
||||||
|
\begin{enumerate}
|
||||||
|
\item Klarheit.
|
||||||
|
\item Vollstaendige Beschriftung.
|
||||||
|
\item Deutliche Unterscheidbarkeit von Kurven.
|
||||||
|
\item Keine suggestive Darstellung.
|
||||||
|
\item Ausgewogenheit von Linienst\"arken Schrift- und Plotgr\"o{\ss}e.
|
||||||
|
\item Fehlerbalken, wenn sie angebracht sind.
|
||||||
|
\end{enumerate}
|
||||||
|
|
||||||
|
@ -17,11 +17,11 @@ Nervensystemen. Dabei ist in erster Linie nur der Zeitpunkt des
|
|||||||
Auftretens eines Aktionspotentials von Bedeutung. Die genaue Form
|
Auftretens eines Aktionspotentials von Bedeutung. Die genaue Form
|
||||||
spielt keine oder nur eine untergeordnete Rolle.
|
spielt keine oder nur eine untergeordnete Rolle.
|
||||||
|
|
||||||
Nach etwas Vorverarbeitung haben elektrophysiologischer Messungen
|
Nach etwas Vorverarbeitung haben elektrophysiologische Messungen
|
||||||
deshalb Listen von Spikezeitpunkten als Ergebniss - sogenannte
|
deshalb Listen von Spikezeitpunkten als Ergebniss - sogenannte
|
||||||
``Spiketrains''. Diese Messungen k\"onnen wiederholt werden und es
|
``Spiketrains''. Diese Messungen k\"onnen wiederholt werden und es
|
||||||
ergeben sich mehrere ``trials'' von Spiketrains
|
ergeben sich mehrere ``trials'' von Spiketrains
|
||||||
(\figref{rasterexamples}).
|
(\figref{rasterexamplesfig}).
|
||||||
|
|
||||||
Spiketrains sind Zeitpunkte von Ereignissen --- den Aktionspotentialen
|
Spiketrains sind Zeitpunkte von Ereignissen --- den Aktionspotentialen
|
||||||
--- und deren Analyse f\"allt daher in das Gebiet der Statistik von
|
--- und deren Analyse f\"allt daher in das Gebiet der Statistik von
|
||||||
|
Before Width: | Height: | Size: 102 KiB After Width: | Height: | Size: 102 KiB |
Before Width: | Height: | Size: 106 KiB After Width: | Height: | Size: 106 KiB |
Before Width: | Height: | Size: 176 KiB After Width: | Height: | Size: 176 KiB |
Before Width: | Height: | Size: 102 KiB After Width: | Height: | Size: 102 KiB |
Before Width: | Height: | Size: 167 KiB After Width: | Height: | Size: 167 KiB |
Before Width: | Height: | Size: 168 KiB After Width: | Height: | Size: 168 KiB |
Before Width: | Height: | Size: 302 KiB After Width: | Height: | Size: 302 KiB |
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 158 KiB After Width: | Height: | Size: 158 KiB |
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 3.2 KiB |
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
Before Width: | Height: | Size: 16 KiB After Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 98 KiB After Width: | Height: | Size: 98 KiB |
Before Width: | Height: | Size: 375 KiB After Width: | Height: | Size: 375 KiB |
Before Width: | Height: | Size: 159 KiB After Width: | Height: | Size: 159 KiB |
@ -128,7 +128,6 @@ interpretiert werden. Die wichtigsten Datentpyen sind folgende:
|
|||||||
(\code{true}) oder falsch (\code{false}) interpretiert werden.
|
(\code{true}) oder falsch (\code{false}) interpretiert werden.
|
||||||
\item \textit{char} - ASCII Zeichen
|
\item \textit{char} - ASCII Zeichen
|
||||||
\end{itemize}
|
\end{itemize}
|
||||||
|
|
||||||
Unter den numerischen Datentypen gibt es verschiedene Arten mit
|
Unter den numerischen Datentypen gibt es verschiedene Arten mit
|
||||||
unterschiedlichem Speicherbedarf und Wertebreich.
|
unterschiedlichem Speicherbedarf und Wertebreich.
|
||||||
|
|
||||||
@ -144,8 +143,6 @@ unterschiedlichem Speicherbedarf und Wertebreich.
|
|||||||
uint8 & 8 bit & $0$ bis $255$ & Digitalisierte Imaging Daten. \\ \hline
|
uint8 & 8 bit & $0$ bis $255$ & Digitalisierte Imaging Daten. \\ \hline
|
||||||
\end{tabular}
|
\end{tabular}
|
||||||
\end{table}
|
\end{table}
|
||||||
|
|
||||||
|
|
||||||
\matlab{} arbeitet meist mit dem ``double'' Datentyp wenn numerische
|
\matlab{} arbeitet meist mit dem ``double'' Datentyp wenn numerische
|
||||||
Daten gespeichert werden. Dennoch lohnt es sich, sich ein wenig mit
|
Daten gespeichert werden. Dennoch lohnt es sich, sich ein wenig mit
|
||||||
den Datentypen auseinanderzusetzen. Ein Szenario, dass in der
|
den Datentypen auseinanderzusetzen. Ein Szenario, dass in der
|
||||||
@ -164,18 +161,15 @@ ben\"otigen.
|
|||||||
|
|
||||||
\section{Vektoren und Matrizen}
|
\section{Vektoren und Matrizen}
|
||||||
|
|
||||||
% \begin{definition}[Vektoren und Matrizen]
|
|
||||||
Vektoren und Matrizen sind die wichtigsten Datenstrukturen in
|
Vektoren und Matrizen sind die wichtigsten Datenstrukturen in
|
||||||
\matlab. In anderen Programmiersprachen heissen sie ein-
|
\matlab{}. In anderen Programmiersprachen heissen sie ein-
|
||||||
bzw. mehrdimensionalen Felder. Felder sind Datenstrukturen, die
|
bzw. mehrdimensionalen Felder. Felder sind Datenstrukturen, die
|
||||||
mehrere Werte des geleichen Datentyps in einer Variablen vereinen. Da
|
mehrere Werte des geleichen Datentyps in einer Variablen vereinen. Da
|
||||||
Matalb seinen Ursprung in der Verarbeitung von mathematischen Vektoren
|
\matlab{} seinen Ursprung in der Verarbeitung von mathematischen
|
||||||
und Matrizen hat, werden sie hier auch so genannt.
|
Vektoren und Matrizen hat, werden sie hier auch so genannt. \matlab{}
|
||||||
|
macht keinen Unterschied zwischen Vektoren und Matrizen. Vektoren
|
||||||
\matlab{} macht keinen Unterschied zwischen Vektoren und Matrizen.
|
sind 2--dimensionale Matrizen bei denen eine Dimension die Gr\"o{\ss}e
|
||||||
Vektoren sind 2-dimensionale Matrizen bei denen eine Dimension die
|
1 hat.
|
||||||
Gr\"o{\ss}e 1 hat.
|
|
||||||
% \end{definition}
|
|
||||||
|
|
||||||
|
|
||||||
\subsection{Vektoren}
|
\subsection{Vektoren}
|
||||||
@ -210,7 +204,6 @@ k\"onnen.
|
|||||||
c =
|
c =
|
||||||
0 2 4 6 8 10
|
0 2 4 6 8 10
|
||||||
\end{lstlisting}
|
\end{lstlisting}
|
||||||
|
|
||||||
Die L\"ange eines Vektors, d.h. die Anzahl der Elemente des Vektors,
|
Die L\"ange eines Vektors, d.h. die Anzahl der Elemente des Vektors,
|
||||||
kann mithilfe der Funktion \code{length()} bestimmt werden. \"Ahnliche
|
kann mithilfe der Funktion \code{length()} bestimmt werden. \"Ahnliche
|
||||||
Information kann \"uber die Funktion \code{size()} erhalten werden. Im
|
Information kann \"uber die Funktion \code{size()} erhalten werden. Im
|
||||||
@ -307,9 +300,9 @@ Element gleichzeitig zuzugreifen.
|
|||||||
\subsubsection{Operationen auf Vektoren}
|
\subsubsection{Operationen auf Vektoren}
|
||||||
|
|
||||||
Mit Vektoren kann sehr einfach gerechnet werden. Listing
|
Mit Vektoren kann sehr einfach gerechnet werden. Listing
|
||||||
\ref{arrayListing5} zeigt Rechnungen mit Vektoren.
|
\ref{arrayListing6} zeigt Rechnungen mit Vektoren.
|
||||||
|
|
||||||
\begin{lstlisting}[caption={Rechnen mit Vektoren.},label=arrayListing5]
|
\begin{lstlisting}[caption={Rechnen mit Vektoren.},label=arrayListing6]
|
||||||
>> a = (0:2:8);
|
>> a = (0:2:8);
|
||||||
>> a + 5 % addiere einen Skalar
|
>> a + 5 % addiere einen Skalar
|
||||||
ans =
|
ans =
|
||||||
@ -347,7 +340,7 @@ entsprechenden Matrixoperationen aus der linearen Algebrar belegt
|
|||||||
(s.u.).
|
(s.u.).
|
||||||
|
|
||||||
Zu Beachten ist des Weiteren noch die Fehlermeldung am Schluss von
|
Zu Beachten ist des Weiteren noch die Fehlermeldung am Schluss von
|
||||||
Listing \ref{arrayListing5}. Wenn zwei Vektoren (elementweise)
|
Listing \ref{arrayListing6}. Wenn zwei Vektoren (elementweise)
|
||||||
miteinander verrechnet werden sollen, muss nicht nur die Anzahl der Elemente
|
miteinander verrechnet werden sollen, muss nicht nur die Anzahl der Elemente
|
||||||
übereinstimmen, sondern es muss auch das Layout (Zeilen- oder
|
übereinstimmen, sondern es muss auch das Layout (Zeilen- oder
|
||||||
Spaltenvektoren) \"ubereinstimmen.
|
Spaltenvektoren) \"ubereinstimmen.
|
||||||
@ -356,7 +349,7 @@ Spaltenvektoren) \"ubereinstimmen.
|
|||||||
Will man Elemente aus einem Vektor entfernen, dann weist man den
|
Will man Elemente aus einem Vektor entfernen, dann weist man den
|
||||||
entsprechenden Zellen einen leeren Wert (\code{[]}) zu.
|
entsprechenden Zellen einen leeren Wert (\code{[]}) zu.
|
||||||
|
|
||||||
\begin{lstlisting}[label=arrayListing6, caption={L\"oschen von Elementen aus einem Vektor.}]
|
\begin{lstlisting}[label=arrayListing7, caption={L\"oschen von Elementen aus einem Vektor.}]
|
||||||
>> a = (0:2:8);
|
>> a = (0:2:8);
|
||||||
>> length(a)
|
>> length(a)
|
||||||
ans =
|
ans =
|
||||||
@ -375,13 +368,13 @@ entsprechenden Zellen einen leeren Wert (\code{[]}) zu.
|
|||||||
|
|
||||||
Neben dem L\"oschen von Vektorinhalten k\"onnen Vektoren auch
|
Neben dem L\"oschen von Vektorinhalten k\"onnen Vektoren auch
|
||||||
erweitert oder zusammengesetzt werden. Auch hier muss das Layout der Vektoren
|
erweitert oder zusammengesetzt werden. Auch hier muss das Layout der Vektoren
|
||||||
\"ubereinstimmen (Listing \ref{arrayListing7}, Zeile 12). Will man
|
\"ubereinstimmen (Listing \ref{arrayListing8}, Zeile 12). Will man
|
||||||
einen Vektor erweitern, kann man \"uber das Ende hinaus
|
einen Vektor erweitern, kann man \"uber das Ende hinaus
|
||||||
zuweisen. \matlab{} erweitert dann die Variable. Auch hierbei muss auf
|
zuweisen. \matlab{} erweitert dann die Variable. Auch hierbei muss auf
|
||||||
das Layout geachtet werden. Zudem ist dieser Vorgang
|
das Layout geachtet werden. Zudem ist dieser Vorgang
|
||||||
``rechenintensiv'' und sollte soweit m\"oglich vermieden werden.
|
``rechenintensiv'' und sollte soweit m\"oglich vermieden werden.
|
||||||
|
|
||||||
\begin{lstlisting}[caption={Zusammenf\"ugen und Erweitern von Vektoren.}, label=arrayListing7]
|
\begin{lstlisting}[caption={Zusammenf\"ugen und Erweitern von Vektoren.}, label=arrayListing8]
|
||||||
>> a = (0:2:8);
|
>> a = (0:2:8);
|
||||||
>> b = (10:2:19);
|
>> b = (10:2:19);
|
||||||
>> c = [a b] % erstelle einen Vektor aus einer Liste von Vektoren
|
>> c = [a b] % erstelle einen Vektor aus einer Liste von Vektoren
|
||||||
@ -577,7 +570,7 @@ Beziehung zwischen Entit\"aten zu testen. Hierzu werden die
|
|||||||
\emph{relationalen Operatoren} (\code{>}, \code{<}, \code{==},
|
\emph{relationalen Operatoren} (\code{>}, \code{<}, \code{==},
|
||||||
\code{!}, gr\"o{\ss}er als, kleiner als, gleich und nicht)
|
\code{!}, gr\"o{\ss}er als, kleiner als, gleich und nicht)
|
||||||
eingesetzt. Mehrere Ausdr\"ucke werden mittels der \textit{logischen
|
eingesetzt. Mehrere Ausdr\"ucke werden mittels der \textit{logischen
|
||||||
Operatoren} (\code{\&}, \code{|}}, UND, ODER ) verkn\"upft. Sie sind f\"ur
|
Operatoren} (\code{\&}, \code{|}, UND, ODER ) verkn\"upft. Sie sind f\"ur
|
||||||
uns nicht nur wichtig um Codeabschnitte bedingt auszuf\"uhren
|
uns nicht nur wichtig um Codeabschnitte bedingt auszuf\"uhren
|
||||||
(Verzweigungen, \ref{controlstructsec}) sondern auch um aus Vektoren
|
(Verzweigungen, \ref{controlstructsec}) sondern auch um aus Vektoren
|
||||||
und Matrizen bequem Elemente auszuw\"ahlen (logisches Indizieren,
|
und Matrizen bequem Elemente auszuw\"ahlen (logisches Indizieren,
|
||||||
@ -933,18 +926,18 @@ bestimmten Bedingungen ausgef\"uhrt wird.
|
|||||||
Am h\"aufigsten genutzter Vertreter ist die \code{if} -
|
Am h\"aufigsten genutzter Vertreter ist die \code{if} -
|
||||||
Anweisung. Sie Wird genutzt um Programmcode nur unter bestimmten
|
Anweisung. Sie Wird genutzt um Programmcode nur unter bestimmten
|
||||||
Bedingungen auszuf\"uhren.
|
Bedingungen auszuf\"uhren.
|
||||||
\begin{definition}
|
|
||||||
Der Kopf der if - Anweisung beginnt mit dem Schl\"usselwort
|
Der Kopf der if - Anweisung beginnt mit dem Schl\"usselwort \code{if}
|
||||||
\code{if} welches von einem \underline{Booleschen Ausdruck}
|
welches von einem \underline{Booleschen Ausdruck} gefolgt wird. Wenn
|
||||||
gefolgt wird. Wenn dieser zu \code{true} ausgewertet werden kann,
|
dieser zu \code{true} ausgewertet werden kann, wird der Code im
|
||||||
wird der Code im K\"orper der Anweisung ausgef\"uhrt. Optional
|
K\"orper der Anweisung ausgef\"uhrt. Optional k\"onnen weitere
|
||||||
k\"onnen weitere Bedingungen mit dem Schl\"usselwort \code{elseif}
|
Bedingungen mit dem Schl\"usselwort \code{elseif} folgen. Ebenfalls
|
||||||
folgen. Ebenfalls optional ist die Verwendung eines finalen
|
optional ist die Verwendung eines finalen \code{else} Falls. Dieser
|
||||||
\code{else} Falls. Dieser wird immer dann ausgef\"uhrt wenn alle
|
wird immer dann ausgef\"uhrt wenn alle vorherigen Bedingungen nicht
|
||||||
vorherigen Bedingungen nicht erf\"ullt werden. Die \code{if}
|
erf\"ullt werden. Die \code{if} Anweisung wird mit \code{end}
|
||||||
Anweisung wird mit \code{end} beendet. Listing \ref{ifelselisting}
|
beendet. Listing \ref{ifelselisting} zeigt den Aufbau einer
|
||||||
zeigt den Aufbau einer if-Anweisung.
|
if-Anweisung.
|
||||||
\end{definition}
|
|
||||||
|
|
||||||
\begin{lstlisting}[label=ifelselisting, caption={Grundger\"ust einer \code{if} Anweisung.}]
|
\begin{lstlisting}[label=ifelselisting, caption={Grundger\"ust einer \code{if} Anweisung.}]
|
||||||
if x < y
|
if x < y
|
||||||
@ -971,19 +964,16 @@ end
|
|||||||
Die \code{switch} Verzweigung Wird eingesetzt wenn mehrere F\"alle
|
Die \code{switch} Verzweigung Wird eingesetzt wenn mehrere F\"alle
|
||||||
auftreten k\"onnen, die einer unterschiedlichen Behandlung bed\"urfen.
|
auftreten k\"onnen, die einer unterschiedlichen Behandlung bed\"urfen.
|
||||||
|
|
||||||
\begin{definition}
|
Wird mit dem Schl\"usselwort \code{switch} begonnen, gefolgt von der
|
||||||
Wird mit dem Schl\"usselwort \code{switch} begonnen, gefolgt von
|
\textit{switch Anweisung} (Zahl oder String). Jeder Fall auf den die
|
||||||
der \textit{switch Anweisung} (Zahl oder String). Jeder Fall auf den
|
Anweisung \"uberpr\"ft werden soll wird mit dem Schl\"usselwort
|
||||||
die Anweisung \"uberpr\"ft werden soll wird mit dem Schl\"usselwort
|
\code{case} eingeleitet. Diese wird gefolgt von der \textit{case
|
||||||
\code{case} eingeleitet. Diese wird gefolgt von der \textit{case
|
Anweisung} welche definiert gegen welchen Fall auf
|
||||||
Anweisung} welche definiert gegen welchen Fall auf
|
\underline{Gleichheit} getestet wird. F\"ur jeden Fall wird der
|
||||||
\underline{Gleichheit} getestet wird. F\"ur jeden Fall wird der
|
Programmcode angegeben, der ausgef\"uhrt werden soll Optional k\"onnen
|
||||||
Programmcode angegeben, der ausgef\"uhrt werden soll Optional
|
mit dem Schl\"usselwort \code{otherwise} alle nicht explizit genannten
|
||||||
k\"onnen mit dem Schl\"usselwort \code{otherwise} alle nicht
|
F\"alle behandelt werden. Die \code{switch} Anweisung wird mit
|
||||||
explizit genannten F\"alle behandelt werden. Die \code{switch}
|
\code{end} beendet (z.B. in Listing \ref{switchlisting}).
|
||||||
Anweisung wird mit \code{end} beendet (z.B. in Listing
|
|
||||||
\ref{switchlisting}).
|
|
||||||
\end{definition}
|
|
||||||
|
|
||||||
|
|
||||||
\begin{lstlisting}[label=switchlisting, caption={Grundger\"ust einer \code{switch} Anweisung.}]
|
\begin{lstlisting}[label=switchlisting, caption={Grundger\"ust einer \code{switch} Anweisung.}]
|
||||||
@ -1022,7 +1012,7 @@ werden, werden die Schl\"usselworte \code{break} und
|
|||||||
\code{continue} eingesetzt (Listing \ref{breakcontinuelisting}
|
\code{continue} eingesetzt (Listing \ref{breakcontinuelisting}
|
||||||
zeigt, wie sie eingesetzt werden k\"onnen).
|
zeigt, wie sie eingesetzt werden k\"onnen).
|
||||||
|
|
||||||
\begin{lstlisting}[caption={Ensatz der \code{continue} und \code{break} Schl\"usselworte um die Ausf\"uhrung von Abschnitte in Schleife zu \"uberspringen oder abzubrechen.}, label=breakcontinuelisting]
|
\begin{lstlisting}[caption={Ensatz der \code{continue} und \code{break} Schl\"usselworte um die Ausf\"uhrung von Code-Abschnitten in Schleifen zu \"uberspringen oder abzubrechen.}, label=breakcontinuelisting]
|
||||||
for x = 1:10
|
for x = 1:10
|
||||||
if(x > 2 & x < 5)
|
if(x > 2 & x < 5)
|
||||||
continue;
|
continue;
|
||||||
@ -1051,7 +1041,7 @@ end
|
|||||||
die zwischen \code{tic} und \code{toc} vergangene Zeit.
|
die zwischen \code{tic} und \code{toc} vergangene Zeit.
|
||||||
|
|
||||||
\begin{enumerate}
|
\begin{enumerate}
|
||||||
\item Benutze eine \code{for} Schleife um die Element auszuw\"ahlen.
|
\item Benutze eine \code{for} Schleife um die Elemente auszuw\"ahlen.
|
||||||
\item Benutze logisches Indizieren.
|
\item Benutze logisches Indizieren.
|
||||||
\end{enumerate}
|
\end{enumerate}
|
||||||
\end{exercise}
|
\end{exercise}
|
||||||
@ -1076,7 +1066,7 @@ end
|
|||||||
|
|
||||||
Ein Programm ist eine Sammlung von Anweisungen, die in einer Datei auf
|
Ein Programm ist eine Sammlung von Anweisungen, die in einer Datei auf
|
||||||
dem Rechner abgelegt sind. Wenn es durch den Aufruf zum Leben erweckt
|
dem Rechner abgelegt sind. Wenn es durch den Aufruf zum Leben erweckt
|
||||||
wird, dann wird es Zeile f\"r Zeile von oben nach unten ausgef\"uhrt.
|
wird, dann wird es Zeile f\"Ur Zeile von oben nach unten ausgef\"uhrt.
|
||||||
|
|
||||||
\matlab{} kennt drei Arten von Programmen:
|
\matlab{} kennt drei Arten von Programmen:
|
||||||
\begin{enumerate}
|
\begin{enumerate}
|
@ -1,14 +0,0 @@
|
|||||||
\section{Kontrollstrukturen}
|
|
||||||
|
|
||||||
\begin{definition}[Kontrollstrukturen]
|
|
||||||
In der Regel wird ein Programm Zeile f\"ur Zeile von oben nach unten
|
|
||||||
ausgef\"uhrt. Manchmal muss der Kontrollfluss aber so gesteuert
|
|
||||||
werden, dass bestimmte Teile des Programmcodes wiederholt oder nur
|
|
||||||
unter bestimmten Bedingungen ausgef\"uhrt werden. Von grosser
|
|
||||||
Bedeutung sind hier zwei Strukturen:
|
|
||||||
\begin{enumerate}
|
|
||||||
|
|
||||||
\item Schleigen.
|
|
||||||
\item Bedingte Anweisungen und Verzweigungen.
|
|
||||||
\end{enumerate}
|
|
||||||
\end{definition}
|
|
@ -1,164 +0,0 @@
|
|||||||
\section{Variablen und Datentypen}
|
|
||||||
|
|
||||||
\subsection{Variablen}
|
|
||||||
|
|
||||||
Eine Variable ist ein Zeiger auf eine Stelle im Speicher (RAM). Dieser
|
|
||||||
Zeiger hat einen Namen, den Variablennamen, und einen Datentyp
|
|
||||||
(Abbildung \ref{variablefig}). Im Speicher wird der Wert der Variablen
|
|
||||||
bin\"ar gespeichert. Wird auf den Wert der Variable zugegriffen, wird
|
|
||||||
dieses Bitmuster je nach Datentyp interpretiert. Das Beispiel in
|
|
||||||
Abbildung \ref{variablefig} zeigt, dass das gleiche Bitmuster im einen
|
|
||||||
Fall als 8-Bit Integer Datentyp zur Zahl 38 interpretiert wird und im
|
|
||||||
anderen Fall als Character zum kaufm\"annischen ``und'' ausgewertet
|
|
||||||
wird. In Matlab sind Datentypen nicht von sehr zentraler
|
|
||||||
Bedeutung. Wir werden uns dennoch sp\"ater etwas genauer mit ihnen
|
|
||||||
befassen.
|
|
||||||
|
|
||||||
\begin{figure}
|
|
||||||
\centering
|
|
||||||
\begin{subfigure}{.5\textwidth}
|
|
||||||
\includegraphics[width=0.8\textwidth]{images/variable}
|
|
||||||
\label{variable:a}
|
|
||||||
\end{subfigure}%
|
|
||||||
\begin{subfigure}{.5\textwidth}
|
|
||||||
\includegraphics[width=.8\textwidth]{images/variableB}
|
|
||||||
\label{variable:b}
|
|
||||||
\end{subfigure}
|
|
||||||
\caption{\textbf{Variablen.} Variablen sind Zeiger auf eine Adresse
|
|
||||||
im Speicher, die einen Namen und einen Datentypen beinhalten. Im
|
|
||||||
Speicher ist der Wert der Variable bin\"ar gespeichert. Abh\"angig
|
|
||||||
vom Datentyp wird dieses Bitmuster unterschiedlich
|
|
||||||
interpretiert.}\label{variablefig}
|
|
||||||
\end{figure}
|
|
||||||
|
|
||||||
|
|
||||||
\subsection{Erzeugen von Variablen}
|
|
||||||
In Matlab kann eine Variable auf der Kommandozeile, in einem Skript
|
|
||||||
oder einer Funktion an beliebiger Stelle erzeugen. Das folgende
|
|
||||||
Listing zeigt zwei M\"oglichkeiten:
|
|
||||||
\footnotesize
|
|
||||||
\begin{lstlisting}[label=varListing1, caption=Erzeugen von Variablen]
|
|
||||||
>> y = []
|
|
||||||
y =
|
|
||||||
[]
|
|
||||||
>>
|
|
||||||
>> x = 38
|
|
||||||
x =
|
|
||||||
38
|
|
||||||
\end{lstlisting}
|
|
||||||
\normalsize
|
|
||||||
|
|
||||||
Die Zeile 1 kann etwa so gelesen werden:''Erzeuge eine Variable mit
|
|
||||||
dem Namen y und weise ihr einen leeren Wert zu.'' Das
|
|
||||||
Gleichheitszeichen ist der sogenannte
|
|
||||||
\textit{Zuweisungsoperator}. Zeile 5 definiert eine Variable x, der
|
|
||||||
nun der Zahlenwert 38 zugewiesen wird. Da Matlab, wenn nicht anders
|
|
||||||
angegeben immer den ``double'' Datentypen benutzt, haben beide
|
|
||||||
Variablen diesen Datentyp.
|
|
||||||
|
|
||||||
\footnotesize
|
|
||||||
\begin{lstlisting}[label=varListing2, caption={Erfragen des Datentyps einer Variable, Listen aller definierten Variablen.}]
|
|
||||||
>>disp(class(x))
|
|
||||||
double
|
|
||||||
>>
|
|
||||||
>> who % oder whos um mehr Information zu bekommen
|
|
||||||
\end{lstlisting}
|
|
||||||
\normalsize
|
|
||||||
|
|
||||||
Bei der Namensgebung ist zu beachten, dass Matlab auf Gro{\ss}- und
|
|
||||||
Kleinschreibung achtet und ein Variablennane mit einem alphabethischen
|
|
||||||
Zeichen beginnen muss. Des Weiteren sind Umlaute, Sonder- und
|
|
||||||
Leerzeichen in Variablennamen nicht erlaubt.
|
|
||||||
|
|
||||||
|
|
||||||
\subsection{Arbeiten mit Variablen}
|
|
||||||
|
|
||||||
Nat\"urlich kann mit den Variablen auch gearbeitet, bzw
|
|
||||||
gerechnet werden. Matlab kennt alle normalen arithmetischen Operatoren wie
|
|
||||||
\code{+, -, *. /}. Die Potenz wird \"uber das Dach Symbol \verb+^+
|
|
||||||
dargestellt. Das folgende Listing zeigt, wie sie benutzt werden.
|
|
||||||
|
|
||||||
\footnotesize
|
|
||||||
\begin{lstlisting}[label=varListing3, caption={Rechnen mit Variablen.}]
|
|
||||||
>> x = 1;
|
|
||||||
>> x + 10
|
|
||||||
ans =
|
|
||||||
11
|
|
||||||
>>
|
|
||||||
>> x % x wurde nicht veraendert
|
|
||||||
ans =
|
|
||||||
1
|
|
||||||
>>
|
|
||||||
>> y = 2;
|
|
||||||
>>
|
|
||||||
>> x + y
|
|
||||||
ans =
|
|
||||||
3
|
|
||||||
>>
|
|
||||||
>> z = x + y
|
|
||||||
z =
|
|
||||||
3
|
|
||||||
>>
|
|
||||||
>> z = z * 5;
|
|
||||||
>> z
|
|
||||||
z =
|
|
||||||
15
|
|
||||||
>>
|
|
||||||
>> clear z
|
|
||||||
\end{lstlisting}
|
|
||||||
\normalsize
|
|
||||||
|
|
||||||
Beachtenswert ist z.B. in Zeilen 3 und 6, dass wir mit dem Inhalt
|
|
||||||
einer Variablen rechnen k\"onnen, ohne dass dadurch ihr Wert
|
|
||||||
ver\"andert wird. Wenn der Wert einer Variablen ver\"andert werden
|
|
||||||
soll, dann muss dieser der Variable explizit zugewiesen werden (mit
|
|
||||||
dem \code{=} Zuweisungsoperator, z.B. Zeilen 16, 20). Zeile 25 zeigt
|
|
||||||
wie eine einzelne Variable gel\"oscht wird.
|
|
||||||
|
|
||||||
|
|
||||||
\subsection{Datentypen}
|
|
||||||
|
|
||||||
Der Datentyp bestimmt, wie die im Speicher abgelegten Bitmuster
|
|
||||||
interpretiert werden. Die Wichtigsten Datentpyen sind folgende:
|
|
||||||
|
|
||||||
\begin{itemize}
|
|
||||||
\item \textit{integer} - Ganze Zahlen. Hier gibt es mehrere
|
|
||||||
Unterarten, die wir in Matlab (meist) ignorieren k\"onnen.
|
|
||||||
\item \textit{double} - Flie{\ss}kommazahlen.
|
|
||||||
\item \textit{complex} - Komplexe Zahlen.
|
|
||||||
\item \textit{logical} - Boolesche Werte, die als wahr
|
|
||||||
(\textit{true}) oder falsch (\textit{false}) interpretiert werden.
|
|
||||||
\item \textit{char} - ASCII Zeichen
|
|
||||||
\end{itemize}
|
|
||||||
|
|
||||||
Unter den numerischen Datentypen gibt es verschiedene Arten mit
|
|
||||||
unterschiedlichem Speicherbedarf und Wertebreich.
|
|
||||||
|
|
||||||
\begin{table}[]
|
|
||||||
\centering
|
|
||||||
\caption{Gel\"aufige Datentypen und ihr Wertebereich.}
|
|
||||||
\label{dtypestab}
|
|
||||||
\begin{tabular}{l|l|c|cl}
|
|
||||||
Datentyp & Speicherbedarf & Wertebereich & Beispiel \\ \cline{1-4}
|
|
||||||
double & 64 bit & $-2^{15} bis 2^{15}-1$ & Flie{\ss}kommazahlen.\\ \cline{1-4}
|
|
||||||
int & 64 bit & $-2^{31} bis 2^{31}-1$ & Ganzzahlige Werte \\ \cline{1-4}
|
|
||||||
int16 & 64 bit & $-2^{15} bis 2^{15}-1$ & Digitalisierte Spannungen. \\ \cline{1-4}
|
|
||||||
uint8 & 64 bit & 0 bis 255 & Digitalisierte Imaging Daten. \cline{1-4}
|
|
||||||
\end{tabular}
|
|
||||||
\end{table}
|
|
||||||
|
|
||||||
|
|
||||||
Matlab arbeitet meist mit dem ``double'' Datentyp wenn numerische
|
|
||||||
Daten gespeichert werden. Dennoch lohnt es sich, sich ein wenig mit
|
|
||||||
den DAtentypen auseinanderzusetzen. Ein Szenario, dass in der
|
|
||||||
Neurobiologie nicht selten ist, ist, dass wir die elektrische
|
|
||||||
Aktivit\"at einer Nervenzelle messen. Die gemessenen Spannungen werden
|
|
||||||
mittels Messkarte digitalisiert und auf dem Rechner
|
|
||||||
gespeichert. Typischerweise k\"onnen mit solchen Messkarten Spannungen
|
|
||||||
im Bereich $\pm 10$\,V gemessen werden. Die Aufl\"osung der Wandler
|
|
||||||
betr\"agt typischerweise 16 bit. Das heisst, dass der gesamte
|
|
||||||
Spannungsbereich in $2^{16}$ Schritte aufgeteilt ist. Um Speicherplatz
|
|
||||||
zu sparen ist es sinnvoll, die gemessenen Daten als ``int16'' Werte im
|
|
||||||
Rechner abzulegen. Die Daten als ``echte'' Spannungen, also als
|
|
||||||
Flie{\ss}kommawerte, abzulegen w\"urde den 4-fachen Speicherplatz
|
|
||||||
ben\"otigen.
|
|
@ -1,56 +0,0 @@
|
|||||||
\section{Vektoren und Matrizen}
|
|
||||||
|
|
||||||
\begin{definition}[Vektoren und Matrizen]
|
|
||||||
Vektoren und Matrizen sind die wichtigsten Datenstrukturen in
|
|
||||||
Matlab. In andern Programmiersprachen spricht man von ein-
|
|
||||||
bzw. mehrdimensionalen Feldern. Felder sind Datenstrukturen, die
|
|
||||||
mehrere Werte des geleichen Datentyps in einer Variablen
|
|
||||||
vereinen. Da Matalb seinen Ursprung in der Verarbeitung von
|
|
||||||
mathematischen Vektoren und Matrizen hat werden sie hier auch so
|
|
||||||
genannt.\\
|
|
||||||
|
|
||||||
In Wahrheit existiert auch in Matlab kein Unterschied zwischen
|
|
||||||
beiden Datenstrukturen. Im Hintergrund sind auch Vektoren
|
|
||||||
2-diemsensionale Matrizen bei denen eine Dimension die Gr\"o{\ss}e 1
|
|
||||||
hat.
|
|
||||||
\end{definition}
|
|
||||||
|
|
||||||
|
|
||||||
\subsection{Vektoren}
|
|
||||||
|
|
||||||
Im Gegensatz zu den Variablen, die einzelene Werte beinhalten,
|
|
||||||
Skalare, kann ein Vektor mehrere Werte des gleichen Datentyps
|
|
||||||
beinhalten (Abbildung \ref{vectorfig} B). Die Variable ``test''
|
|
||||||
enth\"alt in diesem Beispiel vier ganzzahlige Werte.
|
|
||||||
|
|
||||||
|
|
||||||
\begin{figure}
|
|
||||||
\includegraphics[width=0.8\columnwidth]{programming/lectures/images/scalarArray}
|
|
||||||
\caption{\textbf{Skalare und Vektoren. A)} Eine skalare Variable kann
|
|
||||||
genau einen Wert tragen. \textbf{B)} Ein Vektor kann mehrer
|
|
||||||
Werte des gleichen Datentyps (z.B. ganzzahlige Integer Werte)
|
|
||||||
beinhalten. Matlab kennt den Zeilen- (row-) und Spaltenvektor
|
|
||||||
(columnvector).}\label{vectorfig}
|
|
||||||
\end{figure}
|
|
||||||
|
|
||||||
|
|
||||||
\footnotesize
|
|
||||||
\begin{lstlisting}[label=arrayListing1]
|
|
||||||
>> a = [0 1 2 3 4 5 6 7 8 9] % Erstellen eines Zeilenvektors
|
|
||||||
a =
|
|
||||||
0 1 2 3 4 5 6 7 8 9
|
|
||||||
>>
|
|
||||||
>> b = (0:9) % etwas bequemer
|
|
||||||
b =
|
|
||||||
0 1 2 3 4 5 6 7 8 9
|
|
||||||
>>
|
|
||||||
>> c = (0:2:10)
|
|
||||||
c =
|
|
||||||
0 2 4 6 8 10
|
|
||||||
\end{lstlisting}
|
|
||||||
\normalsize
|
|
||||||
|
|
||||||
\subsection{Unterscheidung Zeilen- und Spaltenvektoren}
|
|
||||||
|
|
||||||
|
|
||||||
\subsection{Matrizen}
|
|
31
regression/code/errorGradient.m
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
clear
|
||||||
|
load('lin_regression.mat')
|
||||||
|
|
||||||
|
ms = -1:0.5:5;
|
||||||
|
ns = -10:1:10;
|
||||||
|
|
||||||
|
error_surf = zeros(length(ms), length(ns));
|
||||||
|
gradient_m = zeros(size(error_surf));
|
||||||
|
gradient_n = zeros(size(error_surf));
|
||||||
|
|
||||||
|
for i = 1:length(ms)
|
||||||
|
for j = 1:length(ns)
|
||||||
|
error_surf(i,j) = lsqError([ms(i), ns(j)], x, y);
|
||||||
|
grad = lsqGradient([ms(i), ns(j)], x, y);
|
||||||
|
gradient_m(i,j) = grad(1);
|
||||||
|
gradient_n(i,j) = grad(2);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
figure()
|
||||||
|
hold on
|
||||||
|
[N, M] = meshgrid(ns, ms);
|
||||||
|
%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])
|
||||||
|
saveas(gcf, 'error_gradient', 'pdf')
|
31
regression/code/errorSurface.m
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
clear
|
||||||
|
close all
|
||||||
|
|
||||||
|
load('lin_regression.mat');
|
||||||
|
|
||||||
|
slopes = -5:0.25:5;
|
||||||
|
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([slopes(i), intercepts(j)], x, y);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
|
||||||
|
% plot the error surface
|
||||||
|
figure()
|
||||||
|
[N,M] = meshgrid(intercepts, slopes);
|
||||||
|
s = surface(M,N,error_surf);
|
||||||
|
xlabel('slope', 'rotation', 7.5)
|
||||||
|
ylabel('intercept', 'rotation', -22.5)
|
||||||
|
zlabel('error')
|
||||||
|
set(gca,'xtick', (-5:2.5:5))
|
||||||
|
grid on
|
||||||
|
view(3)
|
||||||
|
set(gcf, 'paperunits', 'centimeters', 'papersize', [15, 15], ...
|
||||||
|
'paperposition', [0., 0., 15, 15])
|
||||||
|
|
||||||
|
saveas(gcf, 'error_surface', 'pdf')
|
31
regression/code/gradientDescent.m
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
clear
|
||||||
|
close all
|
||||||
|
load('lin_regression.mat')
|
||||||
|
|
||||||
|
position = [-2. 10.];
|
||||||
|
gradient = [];
|
||||||
|
errors = [];
|
||||||
|
count = 1;
|
||||||
|
eps = 0.01;
|
||||||
|
|
||||||
|
while isempty(gradient) || norm(gradient) > 0.1
|
||||||
|
gradient = lsqGradient(position, x,y);
|
||||||
|
errors(count) = lsqError(position, x, y);
|
||||||
|
position = position - eps .* gradient;
|
||||||
|
count = count + 1;
|
||||||
|
end
|
||||||
|
figure()
|
||||||
|
subplot(2,1,1)
|
||||||
|
hold on
|
||||||
|
scatter(x,y, 'displayname', 'data')
|
||||||
|
xaxis = min(x):0.01:max(x);
|
||||||
|
f_x = position(1).*xaxis + position(2);
|
||||||
|
plot(xaxis, f_x, 'displayname', 'fit')
|
||||||
|
xlabel('Input')
|
||||||
|
ylabel('Output')
|
||||||
|
grid on
|
||||||
|
legend show
|
||||||
|
subplot(2,1,2)
|
||||||
|
plot(errors)
|
||||||
|
xlabel('optimization steps')
|
||||||
|
ylabel('error')
|
43
regression/code/gradientDescentPlot.m
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
clear
|
||||||
|
close all
|
||||||
|
|
||||||
|
load('lin_regression.mat')
|
||||||
|
|
||||||
|
ms = -1:0.5:5;
|
||||||
|
ns = -10:1:10;
|
||||||
|
|
||||||
|
position = [-2. 10.];
|
||||||
|
gradient = [];
|
||||||
|
error = [];
|
||||||
|
eps = 0.01;
|
||||||
|
|
||||||
|
% claculate error surface
|
||||||
|
error_surf = zeros(length(ms), length(ns));
|
||||||
|
for i = 1:length(ms)
|
||||||
|
for j = 1:length(ns)
|
||||||
|
error_surf(i,j) = lsqError([ms(i), ns(j)], x, y);
|
||||||
|
end
|
||||||
|
end
|
||||||
|
figure()
|
||||||
|
hold on
|
||||||
|
[N, M] = meshgrid(ns, ms);
|
||||||
|
surface(M,N, error_surf, 'FaceAlpha', 0.5);
|
||||||
|
view(3)
|
||||||
|
xlabel('slope')
|
||||||
|
ylabel('intersection')
|
||||||
|
zlabel('error')
|
||||||
|
|
||||||
|
% do the descent
|
||||||
|
|
||||||
|
while isempty(gradient) || norm(gradient) > 0.1
|
||||||
|
gradient = lsqGradient(position, x,y);
|
||||||
|
error = lsqError(position, x, y);
|
||||||
|
plot3(position(1), position(2), error, '.', 'color', 'red', 'markersize', 20)
|
||||||
|
position = position - eps .* gradient;
|
||||||
|
pause(0.05)
|
||||||
|
end
|
||||||
|
|
||||||
|
grid on
|
||||||
|
set(gcf, 'paperunits', 'centimeters', 'papersize', [15, 15], ...
|
||||||
|
'paperposition', [0., 0., 15, 15])
|
||||||
|
saveas(gcf, 'gradient_descent', 'pdf')
|
11
regression/code/lsqError.m
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
function error = lsqError(parameter, x, y)
|
||||||
|
% Objective function for fitting a linear equation to data.
|
||||||
|
%
|
||||||
|
% Arguments: parameter, vector containing slope and intercept (1st and 2nd element)
|
||||||
|
% x, the input values
|
||||||
|
% y, the measured system output
|
||||||
|
%
|
||||||
|
% Retruns: the estimation error in terms of the mean sqaure error
|
||||||
|
|
||||||
|
y_est = x .* parameter(1) + parameter(2);
|
||||||
|
error = meanSquareError(y, y_est);
|
7
regression/code/lsqGradient.m
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
function gradient = lsqGradient(parameter, x, y)
|
||||||
|
h = 1e-6;
|
||||||
|
|
||||||
|
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];
|
@ -1,6 +0,0 @@
|
|||||||
function error = lsq_error(parameter, x, y)
|
|
||||||
% parameter(1) is the slope
|
|
||||||
% parameter(2) is the intercept
|
|
||||||
|
|
||||||
f_x = x .* parameter(1) + parameter(2);
|
|
||||||
error = mean((f_x - y).^2);
|
|
@ -1,7 +0,0 @@
|
|||||||
function gradient = lsq_gradient(parameter, x, y)
|
|
||||||
h = 1e-6;
|
|
||||||
|
|
||||||
partial_m = (lsq_error([parameter(1)+h, parameter(2)],x,y) - lsq_error(parameter,x,y))/ h;
|
|
||||||
partial_n = (lsq_error([parameter(1), parameter(2)+h],x,y) - lsq_error(parameter,x,y))/ h;
|
|
||||||
|
|
||||||
gradient = [partial_m, partial_n];
|
|
9
regression/code/meanSquareError.m
Normal file
@ -0,0 +1,9 @@
|
|||||||
|
function error = meanSquareError(y, y_est)
|
||||||
|
% Function calculates the mean sqauare error between observed and predicted values.
|
||||||
|
%
|
||||||
|
% Agruments: y, the observed values
|
||||||
|
% y_est, the predicted values.
|
||||||
|
%
|
||||||
|
% Returns: the error in the mean-square-deviation sense.
|
||||||
|
|
||||||
|
error = mean((y - y_est).^2);
|
BIN
regression/lecture/figures/error_gradient.pdf
Normal file
BIN
regression/lecture/figures/error_surface.pdf
Normal file
@ -222,7 +222,7 @@
|
|||||||
\end{column}
|
\end{column}
|
||||||
\begin{column}{7cm}
|
\begin{column}{7cm}
|
||||||
\begin{enumerate}
|
\begin{enumerate}
|
||||||
\item Die am h\"aufigstern Angewandte Methode ist die der
|
\item Die am h\"aufigsten angewandte Methode ist die der
|
||||||
kleinsten quadratischen Abweichungen.
|
kleinsten quadratischen Abweichungen.
|
||||||
\item Es wird versucht die Summe der quadratischen Abweichung zu
|
\item Es wird versucht die Summe der quadratischen Abweichung zu
|
||||||
minimieren.
|
minimieren.
|
||||||
|
@ -1,3 +1,256 @@
|
|||||||
\chapter{\tr{Optimization and Gradient Descent}{Optimierung und Gradientenabstiegsverfahren}}
|
\chapter{\tr{Optimization and Gradient Descent}{Optimierung und Gradientenabstiegsverfahren}}
|
||||||
|
|
||||||
|
Ein sehr \"ubliches Problem ist, dass die Abh\"angigkeit von
|
||||||
|
Messwerten von einem Input Parameter durch ein Modell erkl\"art werden
|
||||||
|
soll. Die Frage ist, wie man die beste Parametrisierung des Modells
|
||||||
|
findet. Den Prozess der Prarmeteranpassung nennt man auch Optimierung
|
||||||
|
oder English Fitting. Betrachtet man zum Beispiel die Punktewolke in
|
||||||
|
Abbildung \ref{linregressiondatafig} liegt es nahe einen
|
||||||
|
(verrauschten) linearen Zusammenhang zwischen Einganggr\"{\ss}e
|
||||||
|
(Input) und Systemantwort (output) zu postulieren.
|
||||||
|
|
||||||
|
\begin{figure}
|
||||||
|
\includegraphics[width=0.45\columnwidth]{lin_regress.pdf}
|
||||||
|
\caption{\textbf{Blick auf die Rohdaten.} F\"ur eine Reihe von
|
||||||
|
Eingangswerten, z.B. Stimulusintensit\"aten wurden die Antworten
|
||||||
|
eines Systems gemessen.}\label{linregressiondatafig}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
Wir nehmen an, dass die lineare Geradengleichung ein guten Modell
|
||||||
|
f\"ur das zugrundeliegende System ist.
|
||||||
|
\[f_{m,n}(x) = m\cdot x + n \]
|
||||||
|
|
||||||
|
wobei $x$ die Eingangswerte, $f_{m,n}(x)$ die Systemantwort, $m$ die Steigung
|
||||||
|
und $n$ der y-Achsenabschnitt darstellen (Abbildung
|
||||||
|
\ref{linregressionslopeintersectfig}). In dieser Gleichung gibt es nur zwei Parameter
|
||||||
|
und es wird die Kombination von Steigung ($m$) und y-Achsenabschnitt
|
||||||
|
($n$) gesucht, die die Systemantwort am besten vorhersagen.
|
||||||
|
|
||||||
|
\begin{figure}
|
||||||
|
\begin{minipage}[t]{0.45\columnwidth}
|
||||||
|
\includegraphics[width=\textwidth]{figures/lin_regress_slope.pdf}
|
||||||
|
\end{minipage}
|
||||||
|
\begin{minipage}[t]{0.45\columnwidth}
|
||||||
|
\includegraphics[width=\textwidth]{figures/lin_regress_abscissa.pdf}
|
||||||
|
\end{minipage}
|
||||||
|
\caption{\textbf{Ver\"anderungen der Parameter und ihre Folgen.} Die
|
||||||
|
linke Abbildung zeigt den Effekt einer Ver\"anderung der Steigung
|
||||||
|
w\"ahrend die reche Abbildung die Ver\"anderung des
|
||||||
|
y-Achsenabschnittes
|
||||||
|
illustriert. }\label{linregressionslopeintersectfig}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
Wie wird nun die optimale Kombination aus Steigung und y-Achsenabschnitt gefunden?
|
||||||
|
|
||||||
|
\section{Methode der kleinsten Quadratischen Abweichung}
|
||||||
|
|
||||||
|
Um die optimale Parameterkombination zu finden muss zun\"achst ein
|
||||||
|
Ma{\ss} f\"ur den Unterschied zwischen den tats\"achlich gemessenen
|
||||||
|
und den unter Verwendung eines Parametersatzes vorhergesagten Werten
|
||||||
|
definiert werden. Eine der am h\"aufigsten verwendeten
|
||||||
|
Fehlersch\"atzungen ist der \emph{mittlere qaudratische Abstand} (im
|
||||||
|
Englischen auch mean square error genannt, Abbildung \ref{leastsquareerrorfig}).
|
||||||
|
|
||||||
|
\[ e = \frac{1}{N}\sum^{N}_{1=1} \left( y_i - y^{est}_i)\right )^2\]
|
||||||
|
|
||||||
|
wobei $e$ der Fehler, $N$ die Anzahl gemessener Datenpunkte $y_i$ die
|
||||||
|
Messwerte und $y^{est}_i$ die Vorhersagewerte an den enstprechenden
|
||||||
|
Stellen sind.
|
||||||
|
|
||||||
|
\begin{figure}
|
||||||
|
\includegraphics[width=0.5\columnwidth]{figures/linear_least_squares.pdf}
|
||||||
|
\caption{\textbf{Ermittlung des Mittleren quadratischen Abstands.}
|
||||||
|
Der Abstand zwischen der Vorhersage und dem Modell wird f\"ur
|
||||||
|
jeden gemessenen Datenpunkt ermittelt. Die Differenz zwischen
|
||||||
|
Messwert und Vorhersage wird quadriert, was zum einen das
|
||||||
|
Vorzeichen einer Abweichung entfernt und zum anderen gro{\ss}e
|
||||||
|
Abweichungen \"uberproportional st\"arker bestraft als
|
||||||
|
kleine. Quelle:
|
||||||
|
\url{http://en.wikipedia.org/wiki/Linear_least_squares_(mathematics)}} \label{leastsquareerrorfig}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\begin{exercise}{meanSquareError.m}{}\label{mseexercise}
|
||||||
|
Schreibt eine Funktion, die die mittlere quardatische Abweichung
|
||||||
|
zwischen den beobachteten Werten $y$ und der Vorhersage $y_{est}$
|
||||||
|
berechnet.
|
||||||
|
\end{exercise}
|
||||||
|
|
||||||
|
\section{Zielfunktion --- Objective function}
|
||||||
|
|
||||||
|
Schliesst man in die Fehlerfunktion von oben (\"Ubung
|
||||||
|
\ref{mseexercise}) die Vorhersage des Modells mit ein spricht man von
|
||||||
|
der Zielfunktion oder Englisch ``objective function'':
|
||||||
|
|
||||||
|
\[e(m,n) = \frac{1}{N}\sum^{N}_{1=1} \left( y_i - f_{m,
|
||||||
|
n}(x_i)\right )^2\]
|
||||||
|
|
||||||
|
Das Ziel der Parameteranpassung ist es, den Fehler zu minimieren, die
|
||||||
|
Passung zu optimieren.
|
||||||
|
|
||||||
|
\begin{exercise}{lsqError.m}{}
|
||||||
|
Implementiere die Zielfunktion (\code{lsqError}) f\"ur die
|
||||||
|
Optimierung mit der linearen Geradengleichung.
|
||||||
|
\begin{itemize}
|
||||||
|
\item Die Funktion \"ubernimmt drei Argumente: das erste ist ein
|
||||||
|
2-elementiger Vektor, der die Parameter \code{m} und \code{n}
|
||||||
|
enth\"alt. Der zweite sind die x-Werte, an denen gemessen wurde
|
||||||
|
und der dritte die zugeh\"origen y-Werte.
|
||||||
|
\item Die Funktion gibt den Fehler zur\"uck.
|
||||||
|
\end{itemize}
|
||||||
|
\end{exercise}
|
||||||
|
|
||||||
|
|
||||||
|
\section{Fehlerfl\"ache}
|
||||||
|
|
||||||
|
Die beiden Parameter $m$ und $n$ spanngen eine F\"ache auf. F\"ur jede
|
||||||
|
Kombination aus $m$ und $n$ erhalten wir Vorhersagewerte, die von den
|
||||||
|
gemessenen Werten abweichen werden. 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 man die
|
||||||
|
Fehlerfl\"ache graphisch durch einen 3-d ``surface-plot''
|
||||||
|
darstellen. Wobei auf der x- und y-Achse die beiden Parameter und auf
|
||||||
|
der z-Achse der Fehlerwert aufgetragen wird (Abbildung
|
||||||
|
\ref{errorsurfacefig}).
|
||||||
|
|
||||||
|
\clearpage
|
||||||
|
\begin{figure}
|
||||||
|
\includegraphics[width=0.75\columnwidth]{figures/error_surface.pdf}
|
||||||
|
\caption{\textbf{Fehlerfl\"ache.} Die beiden freien Parameter
|
||||||
|
unseres Modells spannen die Grundfl\"ache des Plots auf. F\"ur
|
||||||
|
jede Kombination von Steigung und y-Achsenabschnitt wird die
|
||||||
|
errechnete Vorhersage des Modells mit den Messwerten verglichen
|
||||||
|
und der Fehlerwert geplottet.}\label{errorsurfacefig}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
Die Fehlerfl\"ache zeigt uns nun an bei welcher Parameterkombination
|
||||||
|
der Fehler minimal, beziehungsweise die Parametertrisierung optimal an
|
||||||
|
die Daten angepasst ist. Wie kann die Fehlerfunktion und die durch sie
|
||||||
|
definierte Fehlerfl\"ache nun benutzt werden um den
|
||||||
|
Optimierungsprozess zu leiten?
|
||||||
|
|
||||||
|
|
||||||
|
\begin{exercise}{errorSurface.m}{}\label{errorsurfaceexercise}
|
||||||
|
Ladet den Datensatz \textit{lin\_regression.mat} in den
|
||||||
|
Workspace. und schreibt ein Skript \code{errorSurface.m} dass den
|
||||||
|
Fehler in Abh\"angigkeit von \code{m} und \code{n} als surface plot
|
||||||
|
darstellt (siehe Hilfe f\"ur die \code{surf} Funktion).
|
||||||
|
\end{exercise}
|
||||||
|
|
||||||
|
|
||||||
|
\section{Gradient}
|
||||||
|
|
||||||
|
Man kann sich den Optimierungsprozess veranschaulichen wenn man sich
|
||||||
|
vorstellt, dass eine Parameterkombination einen Punkt auf der
|
||||||
|
Fehlerfl\"ache definiert. Wenn von diesem Punkt aus eine Kugel
|
||||||
|
losgelassen w\"urde, dann w\"urde sie, dem steilsten Gef\"alle
|
||||||
|
folgend, zum Minimum der Fehlerfl\"ache rollen und dort zum Stehen
|
||||||
|
kommen. Um dem Computer zu sagen, in welche Richtung die Position
|
||||||
|
ver\"andert werden soll muss also die Steigung an der aktellen
|
||||||
|
Position berechnet werden.
|
||||||
|
|
||||||
|
Die Steigung einer Funktion an einer Stelle ist die Ableitung der
|
||||||
|
Funktion an dieser Stelle, die durch den Differenzquotienten f\"ur
|
||||||
|
unendlich kleine Schritte bestimmt wird.
|
||||||
|
|
||||||
|
\[f'(x) = \lim\limits_{h \rightarrow 0} \frac{f(x + h) - f(x)}{h} \]
|
||||||
|
Bei unserem Fittingproblem h\"angt die Fehlerfunktion von zwei
|
||||||
|
Parametern ab und wir bestimmen die Steigung partiell f\"ur jeden
|
||||||
|
Parameter einzeln. Die Partielle Ableitung nach \code{m} sieht so aus:
|
||||||
|
\[\frac{\partial g(m,n)}{\partial m} = \lim\limits_{h \rightarrow 0} \frac{g(m + h, n) - g(m,n)}{h}\]
|
||||||
|
Da wir die Ver\"anderung des Fehlers in Abh\"angigkeit der beiden
|
||||||
|
Parameter bewerten ist der Gradient an der Stelle $(m,n)$ ein
|
||||||
|
zweielementigen Vektor der aus den partiellen Ableitungen nach $m$ und
|
||||||
|
nach $n$ besteht. Die Richtung des Gradienten zeigt die Richtung der
|
||||||
|
gr\"o{\ss}ten Steigung an, seine L\"ange repr\"asentiert die St\"arke
|
||||||
|
des Gef\"alles.
|
||||||
|
|
||||||
|
\[\bigtriangledown g(m,n) = \left( \frac{\partial g(m,n)}{\partial m}, \frac{\partial g(m,n)}{\partial n}\right)\]
|
||||||
|
Die partiellen Ableitungen m\"ussen nicht analytisch berechnet werden
|
||||||
|
sondern wir n\"ahern sie numerisch durch einen sehr kleinen Schritt
|
||||||
|
an.
|
||||||
|
\[\frac{\partial g(m,n)}{\partial m} = \lim\limits_{h \rightarrow
|
||||||
|
0} \frac{g(m + h, n) - g(m,n)}{h} \approx \frac{g(m + h, n) -
|
||||||
|
g(m,n)}{h}\]
|
||||||
|
|
||||||
|
Die graphische Dargestellung der Gradienten (Abbildung
|
||||||
|
\ref{gradientquiverfig}) zeigt, dass diese in die Richtung der
|
||||||
|
gr\"o{\ss}ten Steigung zeigen. Um zum Minimum der Fehlerfunktion zu
|
||||||
|
gelangen sollte man also die entgegengesetzte Richtung einschlagen.
|
||||||
|
|
||||||
|
\begin{figure}
|
||||||
|
\includegraphics[width=0.75\columnwidth]{figures/error_gradient}
|
||||||
|
\caption{\textbf{Darstellung der Gradienten f\"ur jede
|
||||||
|
Parameterkombination.} Jeder Pfeil zeigt die Richtung und die
|
||||||
|
Steigung f\"ur verschiedene Parameterkombination aus Steigung und
|
||||||
|
y-Achsenabschnitt an. Die Kontourlinien im Hintergrund
|
||||||
|
illustrieren die Fehlerfl\"ache. Warme Farben stehen f\"ur
|
||||||
|
gro{\ss}e Fehlerwerte, kalte Farben f\"ur kleine. Jede
|
||||||
|
Kontourlinie steht f\"ur eine Linie gleichen
|
||||||
|
Fehlers.}\label{gradientquiverfig}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\begin{exercise}{lsqGradient.m}{}\label{gradientexercise}
|
||||||
|
Implementiert eine Funktion \code{lsqGradient}, die den aktuellen
|
||||||
|
Parametersatz als 2-elementigen Vektor, die x-Werte und die y-Werte
|
||||||
|
als Argumente entgegennimmt und den Gradienten zur\"uckgibt.
|
||||||
|
\end{exercise}
|
||||||
|
|
||||||
|
\begin{exercise}{errorGradient.m}{}
|
||||||
|
Benutzt die Funktion aus verheriger \"Ubung (\ref{gradientexercise})
|
||||||
|
um f\"ur die jede Parameterkombination aus der Fehlerfl\"ache
|
||||||
|
(\"Ubung \ref{errorsurfaceexercise}) auch den Gradienten zu
|
||||||
|
berechnen und darzustellen. Vektoren im Raum kann man mithilfe der
|
||||||
|
Funktion \code{quiver} geplottet werden.
|
||||||
|
\end{exercise}
|
||||||
|
|
||||||
|
\section{Der Gradientenabstieg}
|
||||||
|
|
||||||
|
Zu guter Letzt muss ``nur'' noch der Gradientenabstieg implementiert
|
||||||
|
werden. Die daf\"ur ben\"otigten Zutaten sollten wir aus den
|
||||||
|
vorangegangenen \"Ubungen haben. Wir brauchen: 1. Die Fehlerfunktion
|
||||||
|
(\code{meanSquareError.m}), 2. die Zielfunktion (\code{lsqError.m})
|
||||||
|
und 3. den Gradienten (\code{lsqGradient.m}). Der Algorithmus
|
||||||
|
f\"ur den Abstieg lautet:
|
||||||
|
\begin{enumerate}
|
||||||
|
\item Starte mit einer beliebigen Parameterkombination $p_0 = (m_0,
|
||||||
|
n_0)$.
|
||||||
|
\item Wiederhole die folgenden Schritte solange, wie die der Gradient \"uber einer bestimmten
|
||||||
|
Schwelle ist (Es kann z.B. die L\"ange des Gradienten \code{norm(gradient) > 0.1}
|
||||||
|
benutzt werden):
|
||||||
|
\begin{itemize}
|
||||||
|
\item Berechne den Gradienten an der akutellen Position $p_t$.
|
||||||
|
\item Gehe einen kleinen Schritt ($\epsilon = 0.01$) in die entgegensetzte Richtung des
|
||||||
|
Gradienten:
|
||||||
|
\[p_{t+1} = p_t - \epsilon \cdot \bigtriangledown g(m_t, n_t)\]
|
||||||
|
\end{itemize}
|
||||||
|
\end{enumerate}
|
||||||
|
|
||||||
|
|
||||||
|
Abbildung \ref{gradientdescentfig} zeigt den Verlauf des
|
||||||
|
Gradientenabstiegs. Von einer Startposition aus wird die Position
|
||||||
|
solange ver\"andert, wie der Gradint eine bestimmte Gr\"o{\ss}e
|
||||||
|
\"uberschreitet. An den Stellen, an denen der Gradient sehr stark ist
|
||||||
|
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}
|
||||||
|
\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
|
||||||
|
Optimierungsschritt an.} \label{gradientdescentfig}
|
||||||
|
\end{figure}
|
||||||
|
|
||||||
|
\clearpage
|
||||||
|
\begin{exercise}{gradientDescent.m}{}
|
||||||
|
Implementiere den Gradientenabstieg f\"ur das Problem der
|
||||||
|
Parameteranpassung der linearen Geradengleichung an die Messdaten in
|
||||||
|
der Datei \code{lin\_regression.mat}.
|
||||||
|
\begin{enumerate}
|
||||||
|
\item Merke Dir f\"ur jeden Schritt den Fehler zwischen
|
||||||
|
Modellvorhersage und Daten.
|
||||||
|
\item Erstelle eine Plot, der die Entwicklung des Fehlers als
|
||||||
|
Funktion der Optimierungsschritte zeigt.
|
||||||
|
\item Erstelle einen Plot, der den besten Fit in die Daten plottet.
|
||||||
|
\end{enumerate}
|
||||||
|
\end{exercise}
|
||||||
|
@ -18,22 +18,15 @@
|
|||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
\part{Grundlagen des Programmierens}
|
\part{Grundlagen des Programmierens}
|
||||||
|
|
||||||
\graphicspath{{programming/lectures/}{programming/lectures/images/}}
|
\graphicspath{{programming/lecture/}{programming/lecture/images/}}
|
||||||
\lstset{inputpath=programming/code}
|
\lstset{inputpath=programming/code}
|
||||||
\include{programming/lectures/programming}
|
\include{programming/lecture/programming}
|
||||||
|
|
||||||
|
|
||||||
\graphicspath{{plotting/lecture/}{plotting/lecture/images/}}
|
\graphicspath{{plotting/lecture/}{plotting/lecture/images/}}
|
||||||
\lstset{inputpath=plotting/code/}
|
\lstset{inputpath=plotting/code/}
|
||||||
\include{plotting/lecture/plotting}
|
\include{plotting/lecture/plotting}
|
||||||
|
|
||||||
\graphicspath{{designpattern/lecture/}{designpattern/lecture/figures/}}
|
|
||||||
\lstset{inputpath=designpattern/code}
|
|
||||||
\include{designpattern/lecture/designpattern}
|
|
||||||
|
|
||||||
\chapter{Cheat-Sheet}
|
|
||||||
|
|
||||||
|
|
||||||
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
\part{Grundlagen der Datenanalyse}
|
\part{Grundlagen der Datenanalyse}
|
||||||
|
|
||||||
@ -58,4 +51,13 @@
|
|||||||
\renewcommand{\texinputpath}{pointprocesses/lecture/}
|
\renewcommand{\texinputpath}{pointprocesses/lecture/}
|
||||||
\include{pointprocesses/lecture/pointprocesses}
|
\include{pointprocesses/lecture/pointprocesses}
|
||||||
|
|
||||||
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
\part{Appendix: }
|
||||||
|
|
||||||
|
\graphicspath{{designpattern/lecture/}{designpattern/lecture/figures/}}
|
||||||
|
\lstset{inputpath=designpattern/code}
|
||||||
|
\include{designpattern/lecture/designpattern}
|
||||||
|
|
||||||
|
\chapter{Cheat-Sheet}
|
||||||
|
|
||||||
\end{document}
|
\end{document}
|
||||||
|