Merge branch 'master' of raven.am28.uni-tuebingen.de:scientificComputing

Conflicts:
	pointprocesses/code/binnedRate.m
	pointprocesses/code/convolutionRate.m
	pointprocesses/code/instantaneousRate.m
	programming/lecture/programming.tex
	programmingstyle/code/calculateSines.m
	programmingstyle/lecture/programmingstyle.tex
This commit is contained in:
Jan Grewe 2015-11-30 12:03:30 +01:00
commit 554a627c66
66 changed files with 1750 additions and 1563 deletions

View File

@ -3,24 +3,44 @@ BASENAME=scientificcomputing-script
SUBDIRS=programming plotting programmingstyle statistics bootstrap regression likelihood pointprocesses designpattern SUBDIRS=programming plotting programmingstyle statistics bootstrap regression likelihood pointprocesses designpattern
SUBTEXS=$(foreach subd, $(SUBDIRS), $(subd)/lecture/$(subd).tex) SUBTEXS=$(foreach subd, $(SUBDIRS), $(subd)/lecture/$(subd).tex)
pdf : chapters $(BASENAME).pdf all : script chapters
chapters : chapters :
for sd in $(SUBDIRS); do $(MAKE) -C $$sd/lecture pdf; done for sd in $(SUBDIRS); do $(MAKE) -C $$sd/lecture chapter; done
script : plots $(BASENAME).pdf
plots :
for sd in $(SUBDIRS); do $(MAKE) -C $$sd/lecture plots; done
pdf : $(BASENAME).pdf
$(BASENAME).pdf : $(BASENAME).tex header.tex $(SUBTEXS) $(BASENAME).pdf : $(BASENAME).tex header.tex $(SUBTEXS)
export TEXMFOUTPUT=.; pdflatex -interaction=scrollmode $< | tee /dev/stderr | fgrep -q "Rerun to get cross-references right" && pdflatex -interaction=scrollmode $< || true pdflatex -interaction=scrollmode $< | tee /dev/stderr | fgrep -q "Rerun to get cross-references right" && pdflatex -interaction=scrollmode $< || true
splitindex $(BASENAME).idx
index : index :
pdflatex -interaction=scrollmode $(BASENAME).tex
splitindex $(BASENAME).idx splitindex $(BASENAME).idx
export TEXMFOUTPUT=.; pdflatex -interaction=scrollmode $(BASENAME).tex pdflatex -interaction=scrollmode $(BASENAME).tex | tee /dev/stderr | fgrep -q "Rerun to get cross-references right" && pdflatex $(BASENAME).tex || true
again :
pdflatex $(BASENAME).tex
watchpdf :
while true; do ! make -s -q pdf && make pdf; sleep 0.5; done
watchscript :
while true; do ! make -s -q script && make script; sleep 0.5; done
clean : clean :
rm -f *~ $(BASENAME).aux $(BASENAME).log $(BASENAME).out $(BASENAME).toc rm -f *~ $(BASENAME).aux $(BASENAME).log $(BASENAME).out $(BASENAME).toc $(BASENAME).lo? $(BASENAME).idx $(BASENAME)-term.i* $(BASENAME)-enterm.i* $(BASENAME)-code.i*
for sd in $(SUBDIRS); do $(MAKE) -C $$sd/lecture clean; done for sd in $(SUBDIRS); do $(MAKE) -C $$sd/lecture clean; done
cleanall : clean cleanall : clean
rm -f $(PDFFILE) rm -f $(BASENAME).pdf
for sd in $(SUBDIRS); do $(MAKE) -C $$sd/lecture cleanall; done
watchpdf :
while true; do ! make -q pdf && make pdf; sleep 0.5; done

View File

@ -1,32 +1,13 @@
BASENAME=bootstrap BASENAME=bootstrap
PYFILES=$(wildcard *.py)
PYPDFFILES=$(PYFILES:.py=.pdf)
all : pdf all : pdf
# script: include ../../chapter.mk
pdf : $(BASENAME)-chapter.pdf
$(BASENAME)-chapter.pdf : $(BASENAME)-chapter.tex $(BASENAME).tex $(PYPDFFILES)
CHAPTER=$$(( $$(sed -n -e '/contentsline {chapter}/{s/.*numberline {\([0123456789]*\)}.*/\1/; p}' $(BASENAME).aux) - 1 )); \
PAGE=$$(sed -n -e '/contentsline {chapter}/{s/.*numberline {.*}.*}{\(.*\)}{chapter.*/\1/; p}' $(BASENAME).aux); \
sed -i -e "s/setcounter{page}{.*}/setcounter{page}{$$PAGE}/; s/setcounter{chapter}{.*}/setcounter{chapter}{$$CHAPTER}/" $(BASENAME)-chapter.tex
pdflatex -interaction=scrollmode $< | tee /dev/stderr | fgrep -q "Rerun to get cross-references right" && pdflatex -interaction=scrollmode $< || true
$(PYPDFFILES) : %.pdf : %.py # script:
python $< pdf : chapter
clean :
rm -f *~
rm -f $(BASENAME).aux $(BASENAME).log
rm -f $(BASENAME)-chapter.aux $(BASENAME)-chapter.log $(BASENAME)-chapter.out
rm -f $(PYPDFFILES) $(GPTTEXFILES)
cleanall : clean
rm -f $(BASENAME)-chapter.pdf
watchpdf : clean : cleanchapter
while true; do ! make -q pdf && make pdf; sleep 0.5; done
cleanall : clean cleanchapter

View File

@ -5,8 +5,10 @@
\lstset{inputpath=../code} \lstset{inputpath=../code}
\graphicspath{{figures/}} \graphicspath{{figures/}}
\setcounter{page}{81} \typein[\pagenumber]{Number of first page}
\setcounter{chapter}{4} \typein[\chapternumber]{Chapter number}
\setcounter{page}{\pagenumber}
\setcounter{chapter}{\chapternumber}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -14,4 +16,10 @@
\input{bootstrap} \input{bootstrap}
\section{TODO}
\begin{itemize}
\item Proper introduction of confidence intervals
\item Proper introduction of statistical tests (significance, power, etc.)
\end{itemize}
\end{document} \end{document}

View File

@ -2,7 +2,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\chapter{\tr{Bootstrap Methods}{Bootstrap Methoden}} \chapter{\tr{Bootstrap Methods}{Bootstrap Methoden}}
Beim Bootstrap erzeugt man sich die Verteilung von Statistiken durch Resampling Beim \determ{Bootstrap} erzeugt man sich die Verteilung von Statistiken durch Resampling
aus der Stichprobe. Das hat mehrere Vorteile: aus der Stichprobe. Das hat mehrere Vorteile:
\begin{itemize} \begin{itemize}
\item Weniger Annahmen (z.B. muss eine Stichprobe nicht normalverteilt sein). \item Weniger Annahmen (z.B. muss eine Stichprobe nicht normalverteilt sein).
@ -21,21 +21,22 @@ aus der Stichprobe. Das hat mehrere Vorteile:
\end{figure} \end{figure}
Zur Erinnerung: In der Statistik interessieren wir uns f\"ur Zur Erinnerung: In der Statistik interessieren wir uns f\"ur
Eigenschaften einer Grundgesamtheit. z.B. die mittlere L\"ange von Eigenschaften einer \determ{Grundgesamtheit}. z.B. die mittlere
sauren Gurken (\figref{statisticalpopulationfig}). Aus der L\"ange von sauren Gurken (\figref{statisticalpopulationfig}). Aus der
Grundgesamtheit wird eine Stichprobe (simple random sample, SRS) Grundgesamtheit wird eine \determ{Stichprobe} (\enterm{simple random
gezogen, da niemals die gesamte Grundgesamtheit gemessen werden kann. sample}, \enterm[SRS|see{simple random sample}]{SRS}) gezogen, da
Dann wird aus dieser einzigen Stichprobe die gew\"unschte Gr\"o{\ss}e niemals die gesamte Grundgesamtheit gemessen werden kann. Dann wird
berechnet (die mittlere Gr\"o{\ss}e der sauren Gurken) und man hofft, aus dieser einzigen Stichprobe die gew\"unschte Gr\"o{\ss}e berechnet
dass die erhaltene Zahl an der entsprechenden unbekannten Gr\"o{\ss}e (die mittlere Gr\"o{\ss}e der sauren Gurken) und man hofft, dass die
der Grundgesamtheit (der Populationsparameter) m\"oglichst nah dran erhaltene Zahl an der entsprechenden unbekannten Gr\"o{\ss}e der
Grundgesamtheit (der \determ{Populationsparameter}) m\"oglichst nah dran
ist. Eine Aufgabe der Statistik ist es, herauszubekommen wie gut der ist. Eine Aufgabe der Statistik ist es, herauszubekommen wie gut der
Populationsparameter abgesch\"atzt worden ist. Populationsparameter abgesch\"atzt worden ist.
Wenn wir viele Stichproben ziehen w\"urden, dann k\"onnte man f\"ur Wenn wir viele Stichproben ziehen w\"urden, dann k\"onnte man f\"ur
jede Stichprobe den gew\"unschten Parameter berechnen, und von diesen jede Stichprobe den gew\"unschten Parameter berechnen, und von diesen
die Wahrscheinlichkeitsverteilung \"uber ein Histogramm bestimmen --- die Wahrscheinlichkeitsverteilung \"uber ein Histogramm bestimmen ---
die ``Stichprobenverteilung'' (sampling distribution, die \determ{Stichprobenverteilung} (\enterm{sampling distribution},
\subfigref{bootstrapsamplingdistributionfig}{a}). \subfigref{bootstrapsamplingdistributionfig}{a}).
\begin{figure}[tp] \begin{figure}[tp]
@ -43,7 +44,7 @@ die ``Stichprobenverteilung'' (sampling distribution,
\includegraphics[height=0.2\textheight]{srs2}\\[2ex] \includegraphics[height=0.2\textheight]{srs2}\\[2ex]
\includegraphics[height=0.2\textheight]{srs3} \includegraphics[height=0.2\textheight]{srs3}
\titlecaption{\label{bootstrapsamplingdistributionfig}Bootstrap der \titlecaption{\label{bootstrapsamplingdistributionfig}Bootstrap der
Stichprobenverteilung}{(a) Von der Grundgesamtheit (population) mit Stichprobenverteilung.}{(a) Von der Grundgesamtheit (population) mit
unbekanntem Parameter (z.B. Mittelwert $\mu$) zieht man unbekanntem Parameter (z.B. Mittelwert $\mu$) zieht man
Stichproben (SRS: simple random samples). Die Statistik (hier Stichproben (SRS: simple random samples). Die Statistik (hier
Bestimmung von $\bar x$) kann f\"ur jede Stichprobe berechnet Bestimmung von $\bar x$) kann f\"ur jede Stichprobe berechnet
@ -68,9 +69,9 @@ Mittelwerte der Stichproben um den Populationsmittelwert streuen
\subfigref{bootstrapsamplingdistributionfig}{b}). \subfigref{bootstrapsamplingdistributionfig}{b}).
Wir k\"onnen aber auch aus der einen Stichprobe die wir haben durch Wir k\"onnen aber auch aus der einen Stichprobe die wir haben durch
Resampling viele neue Stichproben generieren (Bootstrap). Von diesen \determ{Resampling} viele neue Stichproben generieren (Bootstrap). Von diesen
k\"onnen wir jeweils die gew\"unschte Gr\"o{\ss}e berechnen und ihre k\"onnen wir jeweils die gew\"unschte Gr\"o{\ss}e berechnen und ihre
Verteilung bestimmen (Bootstrap Verteilung, Verteilung bestimmen (\determ{Bootstrapverteilung},
\subfigref{bootstrapsamplingdistributionfig}{c}). Diese Verteilung ist \subfigref{bootstrapsamplingdistributionfig}{c}). Diese Verteilung ist
interessanterweise in ihrer Breite und Form der Stichprobenverteilung interessanterweise in ihrer Breite und Form der Stichprobenverteilung
sehr \"ahnlich. Nur streut sie nicht um den Populationswert sonder um sehr \"ahnlich. Nur streut sie nicht um den Populationswert sonder um
@ -92,7 +93,7 @@ Stichprobe vorkommen.
Am besten l\"asst sich die Bootstrap Methode am Beispiel des Am besten l\"asst sich die Bootstrap Methode am Beispiel des
Standardfehlers des Mittelwertes veranschaulichen. Aus der Stichprobe Standardfehlers des Mittelwertes veranschaulichen. Aus der Stichprobe
k\"onnen wir den Mittelwert berechnen. Der Standardfehler des k\"onnen wir den Mittelwert berechnen. Der \determ{Standardfehler} des
Mittelwerts gibt die Standardabweichung an, mit der wir erwarten, dass Mittelwerts gibt die Standardabweichung an, mit der wir erwarten, dass
der gemessene Mittelwert um den Populationsmittelwert streut. der gemessene Mittelwert um den Populationsmittelwert streut.
@ -115,6 +116,7 @@ eine ganze Verteilung von Mittelwerten generieren
(\figref{bootstrapsemfig}). Die Standardabweichung dieser Verteilung (\figref{bootstrapsemfig}). Die Standardabweichung dieser Verteilung
ist dann der gesuchte Standardfehler des Mittelwerts. ist dann der gesuchte Standardfehler des Mittelwerts.
\pagebreak[4]
\begin{exercise}{bootstrapsem.m}{bootstrapsem.out} \begin{exercise}{bootstrapsem.m}{bootstrapsem.out}
Erzeuge die Verteilung der Mittelwerte einer Stichprobe durch Bottstrapping, Erzeuge die Verteilung der Mittelwerte einer Stichprobe durch Bottstrapping,
um daraus den Standardfehler des Mittelwerts zu bestimmen. um daraus den Standardfehler des Mittelwerts zu bestimmen.
@ -147,7 +149,7 @@ Nullhypothese aus den Daten selbst gewonnen werden. Dabei m\"ussen die
Daten entsprechend der Nullhypothese neu aus der Stichprobe gezogen Daten entsprechend der Nullhypothese neu aus der Stichprobe gezogen
werden. werden.
Diese ``Permutationstests'' haben den Vorteil, dass nur die Diese \determ{Permutationstests} haben den Vorteil, dass nur die
Eigenschaft von Interesse zerst\"ort wird, um die Nullhypothese zu Eigenschaft von Interesse zerst\"ort wird, um die Nullhypothese zu
generieren. Alle anderen Eigenschaften der Daten bleiben erhalten. generieren. Alle anderen Eigenschaften der Daten bleiben erhalten.
@ -166,16 +168,18 @@ generieren. Alle anderen Eigenschaften der Daten bleiben erhalten.
Sehr sch\"on lassen sich Permutationstest am Beispiel von Sehr sch\"on lassen sich Permutationstest am Beispiel von
Korrelationen veranschaulichen. Gegeben sind Datenpaare $(x_i, y_i)$. Korrelationen veranschaulichen. Gegeben sind Datenpaare $(x_i, y_i)$.
Daraus k\"onnen wir den Korrelationskoeffizienten berechnen. Wir Daraus k\"onnen wir den
wissen dann aber noch nicht, ob der berechnete Wert tats\"achlich eine \determ[Korrelationskoeffizient]{Korrelationskoeffizienten}
Korrelation anzeigt. Die Nullhypothese ist, dass die Daten nicht berechnen. Wir wissen dann aber noch nicht, ob der berechnete Wert
miteinander korreliert sind. Indem wir die $x$-Werte und die $y$-Werte tats\"achlich eine Korrelation anzeigt. Die Nullhypothese ist, dass
unabh\"angig voneinander permutieren (ihre Reihenfolge zuf\"allig neu die Daten nicht miteinander korreliert sind. Indem wir die $x$-Werte
anordnen), werden die Korrelationen der Datenpaare zerst\"ort. Wenn und die $y$-Werte unabh\"angig voneinander permutieren (ihre
wir das viele Male wiederholen, bekommen wir die Verteilung der Reihenfolge zuf\"allig neu anordnen), werden die Korrelationen der
Korrelationskoeffizienten f\"ur nichtkorrelierte Daten. Aus dieser Datenpaare zerst\"ort. Wenn wir das viele Male wiederholen, bekommen
Verteilung der Nullhypothese k\"onnen wir dann dann die Signifikanz wir die Verteilung der Korrelationskoeffizienten f\"ur
der tats\"achlich gemessenen Korrelation bestimmen. nichtkorrelierte Daten. Aus dieser Verteilung der Nullhypothese
k\"onnen wir dann dann die Signifikanz der tats\"achlich gemessenen
Korrelation bestimmen.
\begin{exercise}{correlationsignificance.m}{correlationsignificance.out} \begin{exercise}{correlationsignificance.m}{correlationsignificance.out}
Bestimme die Signifikanz eines Korrelationskoeffizienten. Bestimme die Signifikanz eines Korrelationskoeffizienten.
@ -186,7 +190,7 @@ Bestimme die Signifikanz eines Korrelationskoeffizienten.
\item Berechne den Korrelationskoeffizient dieser Datenpaare. \item Berechne den Korrelationskoeffizient dieser Datenpaare.
\item Generiere die Verteilung der Nullhypothese ``unkorrelierte \item Generiere die Verteilung der Nullhypothese ``unkorrelierte
Daten'' indem die $x$- und $y$-Daten 1000-mal unabh\"angig Daten'' indem die $x$- und $y$-Daten 1000-mal unabh\"angig
permutiert werden \matlabfun{randperm} und jeweils der permutiert werden \matlabfun{randperm()} und jeweils der
Korrelationskoeffizient berechnet wird. Korrelationskoeffizient berechnet wird.
\item Bestimme aus den Nullhypothesendaten das 95\,\%-Perzentil und \item Bestimme aus den Nullhypothesendaten das 95\,\%-Perzentil und
vergleiche es mit dem tats\"achlichen Korrelationskoeffizienten. vergleiche es mit dem tats\"achlichen Korrelationskoeffizienten.

View File

@ -2,7 +2,7 @@ import numpy as np
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
plt.xkcd() plt.xkcd()
fig = plt.figure( figsize=(6,4) ) fig = plt.figure( figsize=(6,3.5) )
rng = np.random.RandomState(637281) rng = np.random.RandomState(637281)
nsamples = 100 nsamples = 100

View File

@ -2,7 +2,7 @@ import numpy as np
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
plt.xkcd() plt.xkcd()
fig = plt.figure( figsize=(6,4) ) fig = plt.figure( figsize=(6,3.5) )
rng = np.random.RandomState(637281) rng = np.random.RandomState(637281)
# generate correlated data: # generate correlated data:

52
chapter.mk Normal file
View File

@ -0,0 +1,52 @@
# plots:
plots : pythonplots gnuplots
# python plots:
PYFILES=$(wildcard *.py)
PYPDFFILES=$(PYFILES:.py=.pdf)
pythonplots : $(PYPDFFILES)
$(PYPDFFILES) : %.pdf: %.py
python $<
cleanpythonplots :
rm -f $(PYPDFFILES)
# gnuplot plots:
GPTFILES=$(wildcard *.gpt)
GPTTEXFILES=$(GPTFILES:.gpt=.tex)
gnuplots : $(GPTTEXFILES)
$(GPTTEXFILES) : %.tex: %.gpt whitestyles.gp
gnuplot whitestyles.gp $<
epstopdf $*.eps
cleangnuplots :
rm -f $(GPTTEXFILES)
# script:
chapter : $(BASENAME)-chapter.pdf
$(BASENAME)-chapter.pdf : $(BASENAME)-chapter.tex $(BASENAME).tex $(wildcard $(BASENAME).aux) $(PYPDFFILES) $(GPTTEXFILES) ../../header.tex
if test -f $(BASENAME).aux; then \
CHAPTER=$$(( $$(sed -n -e '/contentsline {chapter}/{s/.*numberline {\([0123456789]*\)}.*/\1/; p}' $(BASENAME).aux) - 1 )); \
PAGE=$$(sed -n -e '/contentsline {chapter}/{s/.*numberline {.*}.*}{\(.*\)}{chapter.*/\1/; p}' $(BASENAME).aux); \
fi; \
{ echo $${PAGE:=1}; echo $${CHAPTER:=0}; } | pdflatex -interaction=scrollmode $< | tee /dev/stderr | fgrep -q "Rerun to get cross-references right" && { echo $${PAGE:=1}; echo $${CHAPTER:=0}; } | pdflatex -interaction=scrollmode $< || true
watchchapter :
while true; do ! make -q chapter && make chapter; sleep 0.5; done
cleanchapter : cleanpythonplots cleangnuplots
rm -f *~
rm -f $(BASENAME).aux $(BASENAME).log
rm -f $(BASENAME)-chapter.aux $(BASENAME)-chapter.log $(BASENAME)-chapter.out $(BASENAME)-chapter.idx
cleanallchapter : cleanchapter
rm -f $(BASENAME)-chapter.pdf

View File

@ -1,32 +1,13 @@
BASENAME=designpattern BASENAME=designpattern
PYFILES=$(wildcard *.py)
PYPDFFILES=$(PYFILES:.py=.pdf)
all : pdf all : pdf
# script: include ../../chapter.mk
pdf : $(BASENAME)-chapter.pdf
$(BASENAME)-chapter.pdf : $(BASENAME)-chapter.tex $(BASENAME).tex $(PYPDFFILES)
CHAPTER=$$(( $$(sed -n -e '/contentsline {chapter}/{s/.*numberline {\([0123456789]*\)}.*/\1/; p}' $(BASENAME).aux) - 1 )); \
PAGE=$$(sed -n -e '/contentsline {chapter}/{s/.*numberline {.*}.*}{\(.*\)}{chapter.*/\1/; p}' $(BASENAME).aux); \
sed -i -e "s/setcounter{page}{.*}/setcounter{page}{$$PAGE}/; s/setcounter{chapter}{.*}/setcounter{chapter}{$$CHAPTER}/" $(BASENAME)-chapter.tex
pdflatex -interaction=scrollmode $< | tee /dev/stderr | fgrep -q "Rerun to get cross-references right" && pdflatex -interaction=scrollmode $< || true
$(PYPDFFILES) : %.pdf : %.py # script:
python $< pdf : chapter
clean :
rm -f *~
rm -f $(BASENAME).aux $(BASENAME).log
rm -f $(BASENAME)-chapter.aux $(BASENAME)-chapter.log $(BASENAME)-chapter.out
rm -f $(PYPDFFILES) $(GPTTEXFILES)
cleanall : clean
rm -f $(BASENAME)-chapter.pdf
watchpdf : clean : cleanchapter
while true; do ! make -q pdf && make pdf; sleep 0.5; done
cleanall : clean cleanchapter

View File

@ -5,8 +5,10 @@
\lstset{inputpath=../code} \lstset{inputpath=../code}
\graphicspath{{figures/}} \graphicspath{{figures/}}
\setcounter{page}{125} \typein[\pagenumber]{Number of first page}
\setcounter{chapter}{8} \typein[\chapternumber]{Chapter number}
\setcounter{page}{\pagenumber}
\setcounter{chapter}{\chapternumber}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

View File

@ -10,7 +10,7 @@ einige dieser ``Design pattern'' zusammen.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{for Schleifen \"uber Vektoren} \section{for Schleifen \"uber Vektoren}
Grundlegend ist das Iterieren \"uber den Inhalt eines Vektors mit einer \code{for}-Schleife: Grundlegend ist das Iterieren \"uber den Inhalt eines Vektors mit einer \code{for}-Schleife:
\begin{lstlisting}[caption={for-Schleife mit Indexen \"uber einen Vektor}] \begin{lstlisting}[caption={\varcode{for}-Schleife mit Indexen \"uber einen Vektor}]
x = [2:3:20]; % irgendein Vektor x = [2:3:20]; % irgendein Vektor
for i=1:length(x) % Mit der for-Schleife "loopen" wir ueber den Vektor for i=1:length(x) % Mit der for-Schleife "loopen" wir ueber den Vektor
i % das ist der Index, der die Elemente des Vektors indiziert. i % das ist der Index, der die Elemente des Vektors indiziert.
@ -24,7 +24,7 @@ end
Wenn in der Schleife das Ergebnis in einen Vektor gespeichert werden soll, Wenn in der Schleife das Ergebnis in einen Vektor gespeichert werden soll,
sollten wir vor der Schleife schon einen Vektor f\"ur die Ergebnisse sollten wir vor der Schleife schon einen Vektor f\"ur die Ergebnisse
erstellen: erstellen:
\begin{lstlisting}[caption={for-Schleife zum Schreiben eines Vektors}] \begin{lstlisting}[caption={\varcode{for}-Schleife zum Schreiben eines Vektors}]
x = [1.2 2.3 2.6 3.1]; % irgendein Vektor x = [1.2 2.3 2.6 3.1]; % irgendein Vektor
y = zeros(length(x),1); % Platz fuer die Ergebnisse, genauso viele wie Loops der Schleife y = zeros(length(x),1); % Platz fuer die Ergebnisse, genauso viele wie Loops der Schleife
for i=1:length(x) for i=1:length(x)
@ -39,7 +39,7 @@ mean(y)
Die Berechnungen in der Schleife k\"onnen statt einer Zahl auch einen Vektor Die Berechnungen in der Schleife k\"onnen statt einer Zahl auch einen Vektor
zur\"uckgeben. Wenn die L\"ange diese Vektors bekannt ist, dann kann vorher zur\"uckgeben. Wenn die L\"ange diese Vektors bekannt ist, dann kann vorher
eine entsprechend gro{\ss}e Matrix angelegt werden: eine entsprechend gro{\ss}e Matrix angelegt werden:
\begin{lstlisting}[caption={for-Schleife zum Schreiben von Zeilen einer Matrix}] \begin{lstlisting}[caption={\varcode{for}-Schleife zum Schreiben von Zeilen einer Matrix}]
x = [2:3:20]; % irgendein Vektor x = [2:3:20]; % irgendein Vektor
y = zeros(length(x),10); % Platz fuer die Ergebnisse y = zeros(length(x),10); % Platz fuer die Ergebnisse
for i=1:length(x) for i=1:length(x)
@ -54,7 +54,7 @@ mean(y, 1)
Alternativ k\"onnen die in der Schleife erzeugten Vektoren zu einem Alternativ k\"onnen die in der Schleife erzeugten Vektoren zu einem
einzigen, durchgehenden Vektor zusammengestellt werden: einzigen, durchgehenden Vektor zusammengestellt werden:
\begin{lstlisting}[caption={for-Schleife zum Aneinanderh\"angen von Vektoren}] \begin{lstlisting}[caption={\varcode{for}-Schleife zum Aneinanderh\"angen von Vektoren}]
x = [2:3:20]; % irgendein Vektor x = [2:3:20]; % irgendein Vektor
y = []; % Leerer Vektor fuer die Ergebnisse y = []; % Leerer Vektor fuer die Ergebnisse
for i=1:length(x) for i=1:length(x)
@ -75,7 +75,6 @@ Zufallsgeneratoren geben oft nur Zufallszahlen mit festen Mittelwerten
und Standardabweichungen (auch Skalierungen) zur\"uck. Multiplikation und Standardabweichungen (auch Skalierungen) zur\"uck. Multiplikation
mit einem Faktor skaliert die Standardabweichung und Addition einer Zahl mit einem Faktor skaliert die Standardabweichung und Addition einer Zahl
verschiebt den Mittelwert. verschiebt den Mittelwert.
\begin{lstlisting}[caption={Skalierung von Zufallszahlen}] \begin{lstlisting}[caption={Skalierung von Zufallszahlen}]
% 100 random numbers draw from a Gaussian distribution with mean 0 and standard deviation 1. % 100 random numbers draw from a Gaussian distribution with mean 0 and standard deviation 1.
x = randn(100, 1); x = randn(100, 1);
@ -85,9 +84,8 @@ mu = 4.8;
sigma = 2.3; sigma = 2.3;
y = randn(100, 1)*sigma + mu; y = randn(100, 1)*sigma + mu;
\end{lstlisting} \end{lstlisting}
Das gleiche Prinzip ist manchmal auch sinnvoll f\"ur \code{zeros()} oder \code{ones()}:
Das gleiche Prinzip ist manchmal auch sinnvoll f\"ur \code{zeros} oder \code{ones}: \begin{lstlisting}[caption={Skalierung von \varcode{zeros()} und \varcode{ones()}}]
\begin{lstlisting}[caption={Skalierung von zeros und ones}]
x = -1:0.01:2; % Vektor mit x-Werten x = -1:0.01:2; % Vektor mit x-Werten
plot(x, exp(-x.*x)); plot(x, exp(-x.*x));
% Plotte f\"ur die gleichen x-Werte eine Linie mit y=0.8: % Plotte f\"ur die gleichen x-Werte eine Linie mit y=0.8:
@ -141,26 +139,23 @@ Meistens sollten Histogramme normiert werden, damit sie vergleichbar
mit anderen Histogrammen oder mit theoretischen mit anderen Histogrammen oder mit theoretischen
Wahrscheinlichkeitsverteilungen werden. Wahrscheinlichkeitsverteilungen werden.
Die \code{histogram} Funktion macht das mit den entsprechenden Parametern automatisch: Die \code{histogram()} Funktion macht das mit den entsprechenden Parametern automatisch:
\begin{lstlisting}[caption={Probability-density-function mit der histogram-Funktion}] \begin{lstlisting}[caption={Probability-density-function mit der \varcode{histogram()}-Funktion}]
x = randn(100, 1); % irgendwelche reellwertige Daten x = randn(100, 1); % irgendwelche reellwertige Daten
histogram(x, 'Normalization', 'pdf'); histogram(x, 'Normalization', 'pdf');
\end{lstlisting} \end{lstlisting}
\begin{lstlisting}[caption={Probability mit der \varcode{histogram()}-Funktion}]
\begin{lstlisting}[caption={Probability mit der histogram-Funktion}]
x = randi(6, 100, 1); % irgendwelche integer Daten x = randi(6, 100, 1); % irgendwelche integer Daten
histogram(x, 'Normalization', 'probability'); histogram(x, 'Normalization', 'probability');
\end{lstlisting} \end{lstlisting}
So geht es mit der \code{hist()}-Funktion:
So geht es aber auch: \begin{lstlisting}[caption={Probability-density-function mit der \varcode{hist()}- und \varcode{bar()}-Funktion}]
\begin{lstlisting}[caption={Probability-density-function mit der hist- und bar-Funktion}]
x = randn(100, 1); % irgendwelche reellwertige Daten x = randn(100, 1); % irgendwelche reellwertige Daten
[h, b] = hist(x); % Histogram berechnen [h, b] = hist(x); % Histogram berechnen
h = h/sum(h)/(b(2)-b(1)); % normieren zu einer Wahrscheinlichkeitsdichte h = h/sum(h)/(b(2)-b(1)); % normieren zu einer Wahrscheinlichkeitsdichte
bar(b, h); % und plotten. bar(b, h); % und plotten.
\end{lstlisting} \end{lstlisting}
\begin{lstlisting}[caption={Probability mit der \varcode{hist()}- und \varcode{bar()}-Funktion}]
\begin{lstlisting}[caption={Probability mit der hist- und bar-Funktion}]
x = randi(6, 100, 1); % irgendwelche integer Daten x = randi(6, 100, 1); % irgendwelche integer Daten
[h, b] = hist(x); % Histogram berechnen [h, b] = hist(x); % Histogram berechnen
h = h/sum(h); % normieren zu Wahrscheinlichkeiten h = h/sum(h); % normieren zu Wahrscheinlichkeiten

View File

@ -26,8 +26,10 @@
%%%%% index %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%% index %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage[makeindex]{splitidx} \usepackage[makeindex]{splitidx}
\makeindex \makeindex
\usepackage[totoc]{idxlayout}
\newindex[Fachbegriffe]{term} \newindex[Fachbegriffe]{term}
\newindex[Code]{code} \newindex[Englische Fachbegriffe]{enterm}
\newindex[MATLAB Code]{code}
%%%%% units %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%% units %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage[mediumspace,mediumqspace,Gray]{SIunits} % \ohm, \micro \usepackage[mediumspace,mediumqspace,Gray]{SIunits} % \ohm, \micro
@ -66,9 +68,9 @@
% float placement fractions: % float placement fractions:
\renewcommand{\textfraction}{0.2} \renewcommand{\textfraction}{0.2}
\renewcommand{\topfraction}{0.8} \renewcommand{\topfraction}{0.9}
\renewcommand{\bottomfraction}{0.0} \renewcommand{\bottomfraction}{0.0}
\renewcommand{\floatpagefraction}{0.5} \renewcommand{\floatpagefraction}{0.7}
% spacing for floats: % spacing for floats:
\setlength{\floatsep}{12pt plus 2pt minus 2pt} \setlength{\floatsep}{12pt plus 2pt minus 2pt}
@ -138,6 +140,11 @@
\newcommand{\tabrefb}[1]{\tabb~\tref{#1}} \newcommand{\tabrefb}[1]{\tabb~\tref{#1}}
\newcommand{\tabsrefb}[1]{\tabsb~\tref{#1}} \newcommand{\tabsrefb}[1]{\tabsb~\tref{#1}}
% invisible rule for expanding the height of a row in a table header:
\newcommand{\erh}{\rule[-1.2ex]{0pt}{3.5ex}}
% invisible rule for expanding the height of a row in a table body:
\newcommand{\erb}{\rule{0pt}{2.5ex}}
%%%%% equation references %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%% equation references %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%\newcommand{\eqref}[1]{(\ref{#1})} %\newcommand{\eqref}[1]{(\ref{#1})}
\newcommand{\eqn}{\tr{Eq}{Gl}.} \newcommand{\eqn}{\tr{Eq}{Gl}.}
@ -166,7 +173,7 @@
frame=single, frame=single,
caption={\protect\filename@parse{\lstname}\protect\filename@base}, caption={\protect\filename@parse{\lstname}\protect\filename@base},
captionpos=t, captionpos=t,
xleftmargin=2.5em, xleftmargin=21pt,
xrightmargin=1mm, xrightmargin=1mm,
aboveskip=1ex, aboveskip=1ex,
belowskip=2ex belowskip=2ex
@ -189,11 +196,15 @@
\newcommand{\koZ}{\mathds{C}} \newcommand{\koZ}{\mathds{C}}
%%%%% english, german, code and file terms: %%%%%%%%%%%%%%% %%%%% english, german, code and file terms: %%%%%%%%%%%%%%%
\newcommand{\enterm}[1]{``#1''\sindex[term]{#1}} \usepackage{ifthen}
\newcommand{\determ}[1]{\textit{#1}\sindex[term]{#1}} \newcommand{\enterm}[2][]{``#2''\ifthenelse{\equal{#1}{}}{\protect\sindex[enterm]{#2}}{\protect\sindex[enterm]{#1}}}
\newcommand{\codeterm}[1]{\textit{#1}\sindex[term]{#1}} \newcommand{\determ}[2][]{\textit{#2}\ifthenelse{\equal{#1}{}}{\protect\sindex[term]{#2}}{\protect\sindex[term]{#1}}}
\newcommand{\codeterm}[2][]{\textit{#2}\ifthenelse{\equal{#1}{}}{\protect\sindex[term]{#2}}{\protect\sindex[term]{#1}}}
\newcommand{\file}[1]{\texttt{#1}} \newcommand{\file}[1]{\texttt{#1}}
% for escaping special characters into the index:
\newcommand{\scor}{"|}
%%%%% key-shortcuts %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%% key-shortcuts %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage{tikz} \usepackage{tikz}
\usetikzlibrary{shapes} \usetikzlibrary{shapes}
@ -202,9 +213,17 @@
%%%%% code/matlab commands: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%% code/matlab commands: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage{textcomp} \usepackage{textcomp}
\newcommand{\code}[1]{\setlength{\fboxsep}{0.5ex}\colorbox{codeback}{\texttt{#1}}\sindex[code]{#1}} \newcommand{\varcode}[1]{\setlength{\fboxsep}{0.5ex}\colorbox{codeback}{\texttt{#1\protect\rule[-0.1ex]{0pt}{1.6ex}}}}
\newcommand{\matlab}{MATLAB$^{\copyright}$} \newcommand{\code}[2][]{\varcode{#2}\ifthenelse{\equal{#1}{}}{\protect\sindex[code]{#2}}{\protect\sindex[code]{#1}}}
\newcommand{\matlabfun}[1]{(\tr{\matlab{}-function}{\matlab-Funktion} \setlength{\fboxsep}{0.5ex}\colorbox{codeback}{\texttt{#1}})\sindex[code]{#1}} \newcommand{\matlab}{\texorpdfstring{MATLAB$^{\copyright}$}{MATLAB}}
\newcommand{\matlabfun}[2][]{(\tr{\matlab-function}{\matlab-Funktion} \setlength{\fboxsep}{0.5ex}\colorbox{codeback}{\texttt{#2}})\ifthenelse{\equal{#1}{}}{\protect\sindex[code]{#2}}{\protect\sindex[code]{#1}}}
%%%%% shortquote and widequote commands: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% \shortquote{Something to be quoted}{Source}
\newcommand{\shortquote}[2]{\begin{list}{}{\rightmargin\leftmargin}\item\relax\itshape #1 \hfill \upshape #2\end{list}}
% \widequote{Something to be quoted}{Source}
\newcommand{\widequote}[2]{{\itshape #1} \hfill #2}
%%%%% exercises environment: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%% exercises environment: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% usage: % usage:
@ -223,7 +242,6 @@
% content of someoutput.out % content of someoutput.out
% %
% Innerhalb der exercise Umgebung ist enumerate umdefiniert, um (a), (b), (c), .. zu erzeugen. % Innerhalb der exercise Umgebung ist enumerate umdefiniert, um (a), (b), (c), .. zu erzeugen.
\usepackage{ifthen}
\usepackage{mdframed} \usepackage{mdframed}
\usepackage{xstring} \usepackage{xstring}
\newcommand{\codepath}{} \newcommand{\codepath}{}
@ -241,18 +259,20 @@
\newcommand{\exerciseoutput}{#2}% \newcommand{\exerciseoutput}{#2}%
\setlength{\fboxsep}{2mm}% \setlength{\fboxsep}{2mm}%
\newcommand{\saveenumi}{\theenumi}\renewcommand{\labelenumi}{(\alph{enumi})}% \newcommand{\saveenumi}{\theenumi}\renewcommand{\labelenumi}{(\alph{enumi})}%
\captionsetup{singlelinecheck=off,hypcap=false,labelfont={large,sf,it,bf},font={large,sf,it,bf},skip={0.5ex}} \captionsetup{singlelinecheck=off,hypcap=false,labelfont={large,sf,it,bf},font={large,sf,it,bf},skip={0.5ex}}%
\begin{mdframed}[linewidth=0pt,backgroundcolor=exerciseback]% \begin{mdframed}[linewidth=0pt,backgroundcolor=exerciseback]%
\captionof{exercisef}[\exercisefile]{}% \captionof{exercisef}[\exercisefile]{}%
\captionsetup{font={normal,sf,it}}% \captionsetup{font={normal,sf,it}}%
}% }%
{\ifthenelse{\equal{\exercisesource}{}}{}% {\hypersetup{hypertexnames=false}%
{\ifthenelse{\value{exercise}>\value{maxexercise}}{}% \ifthenelse{\equal{\exercisesource}{}}{}%
{\ifthenelse{\value{exercisef}>\value{maxexercise}}{}%
{\addtocounter{lstlisting}{-1}% {\addtocounter{lstlisting}{-1}%
\lstinputlisting[belowskip=0pt,aboveskip=1ex,nolol=true,title={\textbf{Listing:} \exercisefile}]{\codepath\exercisesource}% \lstinputlisting[belowskip=0pt,aboveskip=1ex,nolol=true,title={\textbf{\tr{Solution}{L\"osung}:} \exercisefile}]{\codepath\exercisesource}%
\ifthenelse{\equal{\exerciseoutput}{}}{}% \ifthenelse{\equal{\exerciseoutput}{}}{}%
{\addtocounter{lstlisting}{-1}% {\addtocounter{lstlisting}{-1}%
\lstinputlisting[language={},title={\textbf{\tr{Output}{Ausgabe}:}},nolol=true,belowskip=0pt]{\codepath\exerciseoutput}}}}% \lstinputlisting[language={},title={\textbf{\tr{Output}{Ausgabe}:}},nolol=true,belowskip=0pt]{\codepath\exerciseoutput}}}}%
\hypersetup{hypertexnames=true}%
\end{mdframed}% \end{mdframed}%
\renewcommand{\theenumi}{\saveenumi}} \renewcommand{\theenumi}{\saveenumi}}
@ -277,11 +297,13 @@
\newenvironment{ibox}[2][tp] \newenvironment{ibox}[2][tp]
{\SetupFloatingEnvironment{iboxf}{placement=#1}% {\SetupFloatingEnvironment{iboxf}{placement=#1}%
\begin{iboxf}% \begin{iboxf}%
\captionsetup{singlelinecheck=off,labelfont={large,sf,it,bf},font={large,sf,it,bf}} \captionsetup{singlelinecheck=off,labelfont={large,sf,it,bf},font={large,sf,it,bf}}%
\begin{mdframed}[linecolor=infoline,linewidth=1ex,% \begin{mdframed}[linecolor=infoline,linewidth=1ex,%
backgroundcolor=infoback,font={\sffamily},% backgroundcolor=infoback,font={\sffamily},%
frametitle={\caption{#2}},frametitleaboveskip=-1ex,% frametitle={\caption{#2}},frametitleaboveskip=-1ex,%
frametitlebackgroundcolor=infoline]}% frametitlebackgroundcolor=infoline]%
\setlength{\parindent}{0pt}\setlength{\parskip}{1ex}%
\captionsetup{singlelinecheck=off,labelfont={normalsize,sf,bf},font={normalsize,sf}}}%
{\end{mdframed}% {\end{mdframed}%
\end{iboxf}} \end{iboxf}}
@ -303,14 +325,16 @@
% placement=t % placement=t
% ]{importantf} % ]{importantf}
\newenvironment{important}[1][]% \newenvironment{important}[1][]%
{\captionsetup{singlelinecheck=off,labelformat={empty},labelfont={large,sf,it,bf},font={large,sf,it,bf}} {\captionsetup{singlelinecheck=off,hypcap=false,labelformat={empty},labelfont={large,sf,it,bf},font={large,sf,it,bf}}
\ifthenelse{\equal{#1}{}}% \ifthenelse{\equal{#1}{}}%
{\begin{mdframed}[linecolor=importantline,linewidth=1ex,% {\begin{mdframed}[linecolor=importantline,linewidth=1ex,%
backgroundcolor=importantback,font={\sffamily}]}% backgroundcolor=importantback,font={\sffamily}]%
\setlength{\parindent}{0pt}\setlength{\parskip}{1ex}}%
{\begin{mdframed}[linecolor=importantline,linewidth=1ex,% {\begin{mdframed}[linecolor=importantline,linewidth=1ex,%
backgroundcolor=importantback,font={\sffamily},% backgroundcolor=importantback,font={\sffamily},%
frametitle={\captionof{iboxf}{#1}},frametitleaboveskip=-1ex,% frametitle={\captionof{iboxf}{#1}},frametitleaboveskip=-1ex,%
frametitlebackgroundcolor=importantline]}% frametitlebackgroundcolor=importantline]%
\setlength{\parindent}{0pt}\setlength{\parskip}{1ex}}%
}% }%
{\end{mdframed}} {\end{mdframed}}
@ -318,5 +342,6 @@
%%%%% hyperref %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%% hyperref %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage[bookmarks=true,bookmarksopen=true,% \usepackage[bookmarks=true,bookmarksopen=true,%
pdfpagemode=UseNone,pdfstartview=FitH,% pdfpagemode=UseNone,pdfstartview=FitH,%
plainpages=false,pdfpagelabels,%
breaklinks=true,colorlinks=true,% breaklinks=true,colorlinks=true,%
citecolor=blue!50!black,linkcolor=red!70!black,urlcolor=blue!50!black]{hyperref} citecolor=blue!50!black,linkcolor=red!70!black,urlcolor=blue!50!black]{hyperref}

View File

@ -1,32 +1,12 @@
BASENAME=likelihood BASENAME=likelihood
PYFILES=$(wildcard *.py)
PYPDFFILES=$(PYFILES:.py=.pdf)
all : pdf all : pdf
# script: include ../../chapter.mk
pdf : $(BASENAME)-chapter.pdf
$(BASENAME)-chapter.pdf : $(BASENAME)-chapter.tex $(BASENAME).tex $(PYPDFFILES)
CHAPTER=$$(( $$(sed -n -e '/contentsline {chapter}/{s/.*numberline {\([0123456789]*\)}.*/\1/; p}' $(BASENAME).aux) - 1 )); \
PAGE=$$(sed -n -e '/contentsline {chapter}/{s/.*numberline {.*}.*}{\(.*\)}{chapter.*/\1/; p}' $(BASENAME).aux); \
sed -i -e "s/setcounter{page}{.*}/setcounter{page}{$$PAGE}/; s/setcounter{chapter}{.*}/setcounter{chapter}{$$CHAPTER}/" $(BASENAME)-chapter.tex
pdflatex -interaction=scrollmode $< | tee /dev/stderr | fgrep -q "Rerun to get cross-references right" && pdflatex -interaction=scrollmode $< || true
$(PYPDFFILES) : %.pdf : %.py
python $<
clean : # script:
rm -f *~ pdf : chapter
rm -f $(BASENAME).aux $(BASENAME).log
rm -f $(BASENAME)-chapter.aux $(BASENAME)-chapter.log $(BASENAME)-chapter.out
rm -f $(PYPDFFILES) $(GPTTEXFILES)
cleanall : clean
rm -f $(BASENAME)-chapter.pdf
watchpdf :
while true; do ! make -q pdf && make pdf; sleep 0.5; done
clean : cleanchapter
cleanall : clean cleanchapter

View File

@ -5,8 +5,10 @@
\lstset{inputpath=../code} \lstset{inputpath=../code}
\graphicspath{{figures/}} \graphicspath{{figures/}}
\setcounter{page}{101} \typein[\pagenumber]{Number of first page}
\setcounter{chapter}{6} \typein[\chapternumber]{Chapter number}
\setcounter{page}{\pagenumber}
\setcounter{chapter}{\chapternumber}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -14,4 +16,9 @@
\input{likelihood} \input{likelihood}
\section{TODO}
\begin{itemize}
\item GLM model fitting?
\end{itemize}
\end{document} \end{document}

View File

@ -7,7 +7,8 @@
In vielen Situationen wollen wir einen oder mehrere Parameter $\theta$ In vielen Situationen wollen wir einen oder mehrere Parameter $\theta$
einer Wahrscheinlichkeitsverteilung sch\"atzen, so dass die Verteilung einer Wahrscheinlichkeitsverteilung sch\"atzen, so dass die Verteilung
die Daten $x_1, x_2, \ldots x_n$ am besten beschreibt. die Daten $x_1, x_2, \ldots x_n$ am besten beschreibt.
Maximum-Likelihood-Sch\"atzer (maximum likelihood estimate, mle) \determ{Maximum-Likelihood-Sch\"atzer} (\enterm{maximum likelihood
estimator}, \determ[mle|see{Maximum-Likelihood-Sch\"atzer}]{mle})
w\"ahlen die Parameter so, dass die Wahrscheinlichkeit, dass die Daten w\"ahlen die Parameter so, dass die Wahrscheinlichkeit, dass die Daten
aus der Verteilung stammen, am gr\"o{\ss}ten ist. aus der Verteilung stammen, am gr\"o{\ss}ten ist.
@ -31,8 +32,10 @@ Auftretens der Werte $x_1, x_2, \ldots x_n$ gegeben ein bestimmtes $\theta$
p(x_1,x_2, \ldots x_n|\theta) = p(x_1|\theta) \cdot p(x_2|\theta) p(x_1,x_2, \ldots x_n|\theta) = p(x_1|\theta) \cdot p(x_2|\theta)
\ldots p(x_n|\theta) = \prod_{i=1}^n p(x_i|\theta) \; . \ldots p(x_n|\theta) = \prod_{i=1}^n p(x_i|\theta) \; .
\end{equation} \end{equation}
Andersherum gesehen ist das die Likelihood (deutsch immer noch ``Wahrscheinlichleit'') Andersherum gesehen ist das die \determ{Likelihood}
den Parameter $\theta$ zu haben, gegeben die Me{\ss}werte $x_1, x_2, \ldots x_n$, (\enterm{likelihood}, deutsch immer noch ``Wahrscheinlichleit'') den
Parameter $\theta$ zu haben, gegeben die Me{\ss}werte $x_1, x_2,
\ldots x_n$,
\begin{equation} \begin{equation}
{\cal L}(\theta|x_1,x_2, \ldots x_n) = p(x_1,x_2, \ldots x_n|\theta) {\cal L}(\theta|x_1,x_2, \ldots x_n) = p(x_1,x_2, \ldots x_n|\theta)
\end{equation} \end{equation}
@ -55,7 +58,7 @@ An der Stelle eines Maximums einer Funktion \"andert sich nichts, wenn
man die Funktionswerte mit einer streng monoton steigenden Funktion man die Funktionswerte mit einer streng monoton steigenden Funktion
transformiert. Aus numerischen und gleich ersichtlichen mathematischen transformiert. Aus numerischen und gleich ersichtlichen mathematischen
Gr\"unden wird meistens das Maximum der logarithmierten Likelihood Gr\"unden wird meistens das Maximum der logarithmierten Likelihood
(``Log-Likelihood'') gesucht: (\determ{log-Likelihood}, \enterm{log-likelihood}) gesucht:
\begin{eqnarray} \begin{eqnarray}
\theta_{mle} & = & \text{argmax}_{\theta}\; {\cal L}(\theta|x_1,x_2, \ldots x_n) \nonumber \\ \theta_{mle} & = & \text{argmax}_{\theta}\; {\cal L}(\theta|x_1,x_2, \ldots x_n) \nonumber \\
& = & \text{argmax}_{\theta}\; \log {\cal L}(\theta|x_1,x_2, \ldots x_n) \nonumber \\ & = & \text{argmax}_{\theta}\; \log {\cal L}(\theta|x_1,x_2, \ldots x_n) \nonumber \\
@ -73,7 +76,7 @@ $\theta$ maximiert dessen Likelhood?
\begin{figure}[t] \begin{figure}[t]
\includegraphics[width=1\textwidth]{mlemean} \includegraphics[width=1\textwidth]{mlemean}
\titlecaption{\label{mlemeanfig} Maximum Likelihood Estimation des \titlecaption{\label{mlemeanfig} Maximum Likelihood Sch\"atzung des
Mittelwerts.}{Oben: Die Daten zusammen mit drei m\"oglichen Mittelwerts.}{Oben: Die Daten zusammen mit drei m\"oglichen
Normalverteilungen mit unterschiedlichen Mittelwerten (Pfeile) aus Normalverteilungen mit unterschiedlichen Mittelwerten (Pfeile) aus
denen die Daten stammen k\"onnten. Unteln links: Die Likelihood denen die Daten stammen k\"onnten. Unteln links: Die Likelihood
@ -115,13 +118,14 @@ diesem Mittelwert gezogen worden sind (\figref{mlemeanfig}).
Wahrscheinlichkeiten) f\"ur den Mittelwert als Parameter. Vergleiche Wahrscheinlichkeiten) f\"ur den Mittelwert als Parameter. Vergleiche
die Position der Maxima mit dem aus den Daten berechneten die Position der Maxima mit dem aus den Daten berechneten
Mittelwert. Mittelwert.
\newpage \pagebreak[4]
\end{exercise} \end{exercise}
\pagebreak[4]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Kurvenfit als Maximum-Likelihood Sch\"atzung} \section{Kurvenfit als Maximum-Likelihood Sch\"atzung}
Beim Kurvenfit soll eine Funktion $f(x;\theta)$ mit den Parametern Beim \determ{Kurvenfit} soll eine Funktion $f(x;\theta)$ mit den Parametern
$\theta$ an die Datenpaare $(x_i|y_i)$ durch Anpassung der Parameter $\theta$ an die Datenpaare $(x_i|y_i)$ durch Anpassung der Parameter
$\theta$ gefittet werden. Wenn wir annehmen, dass die $y_i$ um die $\theta$ gefittet werden. Wenn wir annehmen, dass die $y_i$ um die
entsprechenden Funktionswerte $f(x_i;\theta)$ mit einer entsprechenden Funktionswerte $f(x_i;\theta)$ mit einer
@ -195,7 +199,7 @@ die Steigung $m$ und der y-Achsenabschnitt $b$ einer Geradengleichung
\[ y = m \cdot x +b \] \[ y = m \cdot x +b \]
oder allgemeiner die Koeffizienten $a_k$ eines Polynoms oder allgemeiner die Koeffizienten $a_k$ eines Polynoms
\[ y = \sum_{k=0}^N a_k x^k = a_o + a_1x + a_2x^2 + a_3x^4 + \ldots \] \[ y = \sum_{k=0}^N a_k x^k = a_o + a_1x + a_2x^2 + a_3x^4 + \ldots \]
\matlabfun{polyfit}. \matlabfun{polyfit()}.
Parameter, die nichtlinear in einer Funktion enthalten sind, k\"onnen Parameter, die nichtlinear in einer Funktion enthalten sind, k\"onnen
im Gegensatz dazu nicht analytisch aus den Daten berechnet im Gegensatz dazu nicht analytisch aus den Daten berechnet
@ -203,28 +207,28 @@ werden. z.B. die Rate $\lambda$ eines exponentiellen Zerfalls
\[ y = c \cdot e^{\lambda x} \quad , \quad c, \lambda \in \reZ \; . \] \[ y = c \cdot e^{\lambda x} \quad , \quad c, \lambda \in \reZ \; . \]
F\"ur diesen Fall bleibt dann nur auf numerische Verfahren zur F\"ur diesen Fall bleibt dann nur auf numerische Verfahren zur
Optimierung der Kostenfunktion, wie z.B. der Gradientenabstieg, Optimierung der Kostenfunktion, wie z.B. der Gradientenabstieg,
zur\"uckzugreifen \matlabfun{lsqcurvefit}. zur\"uckzugreifen \matlabfun{lsqcurvefit()}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Fits von Wahrscheinlichkeitsverteilungen} \section{Fits von Wahrscheinlichkeitsverteilungen}
Jetzt betrachten wir noch den Fall, bei dem wir die Parameter einer Jetzt betrachten wir noch den Fall, bei dem wir die Parameter einer
Wahrscheinlichkeitsdichtefunktion (z.B. den shape-Parameter einer Wahrscheinlichkeitsdichtefunktion (z.B. den shape-Parameter einer
Gamma-Verteilung) an ein Datenset fitten wollen. \determ{Gamma-Verteilung}) an ein Datenset fitten wollen.
Ein erster Gedanke k\"onnte sein, die Ein erster Gedanke k\"onnte sein, die
Wahrscheinlichkeitsdichtefunktion durch Minimierung des quadratischen \determ[Wahrscheinlichkeitsdichte]{Wahrscheinlichkeitsdichtefunktion}
Abstands an ein Histogramm der Daten zu fitten. Das ist aber aus durch Minimierung des quadratischen Abstands an ein Histogramm der
folgenden Gr\"unden nicht die Methode der Wahl: (i) Daten zu fitten. Das ist aber aus folgenden Gr\"unden nicht die
Wahrscheinlichkeitsdichten k\"onnen nur positiv sein. Darum k\"onnen Methode der Wahl: (i) Wahrscheinlichkeitsdichten k\"onnen nur positiv
insbesondere bei kleinen Werten die Daten nicht symmetrisch streuen, sein. Darum k\"onnen insbesondere bei kleinen Werten die Daten nicht
wie es bei normalverteilten Daten der Fall ist. (ii) Die Datenwerte symmetrisch streuen, wie es bei normalverteilten Daten der Fall
sind nicht unabh\"angig, da das normierte Histogram sich zu Eins ist. (ii) Die Datenwerte sind nicht unabh\"angig, da das normierte
aufintegriert. Die beiden Annahmen normalverteilte und unabh\"angige Histogram sich zu Eins aufintegriert. Die beiden Annahmen
Daten, die die Minimierung des quadratischen Abstands normalverteilte und unabh\"angige Daten, die die Minimierung des
\eqnref{chisqmin} zu einem Maximum-Likelihood Sch\"atzer machen, sind quadratischen Abstands \eqnref{chisqmin} zu einem Maximum-Likelihood
also verletzt. (iii) Das Histogramm h\"angt von der Wahl der Sch\"atzer machen, sind also verletzt. (iii) Das Histogramm h\"angt
Klassenbreite ab (\figref{mlepdffig}). von der Wahl der Klassenbreite ab (\figref{mlepdffig}).
\begin{figure}[t] \begin{figure}[t]
\includegraphics[width=1\textwidth]{mlepdf} \includegraphics[width=1\textwidth]{mlepdf}
@ -243,12 +247,12 @@ Maximum Likelihood! Wir suchen einfach die Parameter $\theta$ der
gesuchten Wahrscheinlichkeitsdichtefunktion bei der die Log-Likelihood gesuchten Wahrscheinlichkeitsdichtefunktion bei der die Log-Likelihood
\eqnref{loglikelihood} maximal wird. Das ist im allgemeinen ein \eqnref{loglikelihood} maximal wird. Das ist im allgemeinen ein
nichtlinieares Optimierungsproblem, das mit numerischen Verfahren, wie nichtlinieares Optimierungsproblem, das mit numerischen Verfahren, wie
z.B. dem Gradientenabstieg, gel\"ost wird \matlabfun{mle}. z.B. dem Gradientenabstieg, gel\"ost wird \matlabfun{mle()}.
\begin{exercise}{mlegammafit.m}{mlegammafit.out} \begin{exercise}{mlegammafit.m}{mlegammafit.out}
Erzeuge Gammaverteilte Zufallszahlen und benutze Maximum-Likelihood, Erzeuge Gammaverteilte Zufallszahlen und benutze Maximum-Likelihood,
um die Parameter der Gammafunktion aus den Daten zu bestimmen. um die Parameter der Gammafunktion aus den Daten zu bestimmen.
\newpage \pagebreak
\end{exercise} \end{exercise}
@ -259,8 +263,9 @@ Aktivit\"at Eigenschaften von sensorischen Stimuli. z.B. im visuellen
Kortex V1 die Orientierung eines Balkens. Traditionell wird die Kortex V1 die Orientierung eines Balkens. Traditionell wird die
Antwort der Neurone f\"ur verschiedene Stimuli (z.B. verschiedene Antwort der Neurone f\"ur verschiedene Stimuli (z.B. verschiedene
Orientierungen des Balkens) gemessen. Die mittlere Antwort der Neurone Orientierungen des Balkens) gemessen. Die mittlere Antwort der Neurone
als Funktion eines Stimulusparameters ist dann die ``Tuning-curve'' als Funktion eines Stimulusparameters ist dann die
(z.B. Feuerrate als Funktion des Orientierungswinkels). \enterm{Tuning-curve} (deutsch \determ{Abstimmkurve}, z.B. Feuerrate
als Funktion des Orientierungswinkels).
\begin{figure}[tp] \begin{figure}[tp]
\includegraphics[width=1\textwidth]{mlecoding} \includegraphics[width=1\textwidth]{mlecoding}

View File

@ -2,7 +2,7 @@ import numpy as np
import matplotlib.pyplot as plt import matplotlib.pyplot as plt
plt.xkcd() plt.xkcd()
fig = plt.figure( figsize=(6,4) ) fig = plt.figure( figsize=(6,3.5) )
# the line: # the line:
slope = 2.0 slope = 2.0

View File

@ -1,15 +1,11 @@
clear all
close all
load('pyramidal_response.mat') load('pyramidal_response.mat')
threshold = 20; % mV threshold = 20; % mV
figure()
hold on hold on
plot(time*1000.0, neuronal_data, 'color', [0.2 0.5 0.7], 'linewidth', 1., ... plot(time*1000.0, neuronal_data, 'color', [0.2 0.5 0.7], ...
'displayname', 'Membrane voltage') 'linewidth', 1., 'displayname', 'Membrane voltage')
plot(spikes*1000.0, ones(size(spikes)) .* threshold, 'r.', 'markersize', 15, ... plot(spikes*1000.0, ones(size(spikes)) .* threshold, 'r.', ...
'displayname', 'Spike times') 'markersize', 15, 'displayname', 'Spike times')
line([time(1) time(end)], [threshold threshold], 'linestyle', '--', ... line([time(1) time(end)], [threshold threshold], 'linestyle', '--', ...
'linewidth', 0.75, 'color', [0.5 0.5 0.5], 'displayname', 'Threshold') 'linewidth', 0.75, 'color', [0.5 0.5 0.5], 'displayname', 'Threshold')
@ -24,7 +20,7 @@ set(l,'location','northeast', 'fontsize', 11, 'linewidth', 1.);
set(gca, 'xminortick','on','yminortick','on') set(gca, 'xminortick','on','yminortick','on')
set(gca, 'tickdir','out', 'linewidth', 1.5, 'fontname', 'times', ... set(gca, 'tickdir','out', 'linewidth', 1.5, 'fontname', 'times', ...
'fontsize', 11) 'fontsize', 11)
set(gcf, 'paperunits', 'centimeters', 'papersize', [15 7.5]); set(gcf, 'paperunits', 'centimeters', 'papersize', [15 7]);
set(gcf, 'paperposition',[0.0 0.0 15, 7.5], 'color', 'white') set(gcf, 'paperposition',[0.0 0.0 15, 7], 'color', 'white')
saveas(gcf, [pwd '/../lecture/images/spike_detection.pdf'], 'pdf') saveas(gcf, 'spike_detection.pdf', 'pdf')

View File

@ -1,21 +1,12 @@
BASENAME=plotting BASENAME=plotting
PYFILES=$(wildcard *.py)
PYPDFFILES=$(PYFILES:.py=.pdf)
GPTFILES=$(wildcard *.gpt)
GPTTEXFILES=$(GPTFILES:.gpt=.tex)
all: pdf slides thumbs all: pdf slides thumbs
include ../../chapter.mk
# script: # script:
pdf : $(BASENAME)-chapter.pdf pdf : chapter
$(BASENAME)-chapter.pdf : $(BASENAME)-chapter.tex $(BASENAME).tex $(GPTTEXFILES) $(PYPDFFILES) ../../header.tex
CHAPTER=$$(( $$(sed -n -e '/contentsline {chapter}/{s/.*numberline {\([0123456789]*\)}.*/\1/; p}' $(BASENAME).aux) - 1 )); \
PAGE=$$(sed -n -e '/contentsline {chapter}/{s/.*numberline {.*}.*}{\(.*\)}{chapter.*/\1/; p}' $(BASENAME).aux); \
sed -i -e "s/setcounter{page}{.*}/setcounter{page}{$$PAGE}/; s/setcounter{chapter}{.*}/setcounter{chapter}{$$CHAPTER}/" $(BASENAME)-chapter.tex
pdflatex -interaction=scrollmode $< | tee /dev/stderr | fgrep -q "Rerun to get cross-references right" && pdflatex -interaction=scrollmode $< || true
# slides: # slides:
@ -31,31 +22,15 @@ $(BASENAME)-handout.pdf: $(BASENAME)-slides.tex $(GPTTEXFILES)
pdfnup --nup 2x4 --no-landscape --paper a4paper --trim "-1cm -1cm -1cm -1cm" --outfile $@ thumbsfoils.pdf # 1-19 pdfnup --nup 2x4 --no-landscape --paper a4paper --trim "-1cm -1cm -1cm -1cm" --outfile $@ thumbsfoils.pdf # 1-19
rm thumbsfoils.* rm thumbsfoils.*
watchpdf :
while true; do ! make -q pdf && make pdf; sleep 0.5; done
watchslides : watchslides :
while true; do ! make -q slides && make slides; sleep 0.5; done while true; do ! make -q slides && make slides; sleep 0.5; done
# python plots:
$(PYPDFFILES) : %.pdf: %.py
python $<
# gnuplot plots:
$(GPTTEXFILES) : %.tex: %.gpt whitestyles.gp
gnuplot whitestyles.gp $<
epstopdf $*.eps
clean : clean : cleanchapter
rm -f *~
rm -f $(BASENAME).aux $(BASENAME).log
rm -f $(BASENAME)-chapter.aux $(BASENAME)-chapter.log $(BASENAME)-chapter.out
rm -f $(BASENAME)-slides.aux $(BASENAME)-slides.log $(BASENAME)-slides.out $(BASENAME)-slides.toc $(BASENAME)-slides.nav $(BASENAME)-slides.snm $(BASENAME)-slides.vrb rm -f $(BASENAME)-slides.aux $(BASENAME)-slides.log $(BASENAME)-slides.out $(BASENAME)-slides.toc $(BASENAME)-slides.nav $(BASENAME)-slides.snm $(BASENAME)-slides.vrb
rm -f $(PYPDFFILES) $(GPTTEXFILES)
cleanall : clean cleanall : clean cleanallchapter
rm -f $(BASENAME)-chapter.pdf $(BASENAME)-slides.pdf $(BASENAME)-handout.pdf rm -f $(BASENAME)-slides.pdf $(BASENAME)-handout.pdf
help : help :

View File

@ -5,8 +5,10 @@
\lstset{inputpath=../code} \lstset{inputpath=../code}
\graphicspath{{images/}} \graphicspath{{images/}}
\setcounter{page}{45} \typein[\pagenumber]{Number of first page}
\setcounter{chapter}{1} \typein[\chapternumber]{Chapter number}
\setcounter{page}{\pagenumber}
\setcounter{chapter}{\chapternumber}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -14,5 +16,13 @@
\input{plotting} \input{plotting}
\section{TODO}
\begin{itemize}
\item Beispiele schlechter plots sollten mehr Bezug zu den Typen von
plots haben, die wir machen!
\item subplot
\item Uebersicht zu wichtigen plot Befehlen (plot, scatter, bar, step, ...)
\end{itemize}
\end{document} \end{document}

View File

@ -1,4 +1,4 @@
\chapter{\tr{Data plotting}{Graphische Darstellung von Daten}} \chapter{Graphische Darstellung von Daten}
Die F\"ahigkeit zur ad\"aquaten Darstellung wissenschaftlicher Daten Die F\"ahigkeit zur ad\"aquaten Darstellung wissenschaftlicher Daten
darf durchaus zu den notwendigen Kernkompetenzen gez\"ahlt werden. Wir darf durchaus zu den notwendigen Kernkompetenzen gez\"ahlt werden. Wir
@ -34,13 +34,13 @@ Zwecken genutzt wird.
Ein Datenplot muss ausreichend beschriftet werden: Ein Datenplot muss ausreichend beschriftet werden:
\begin{itemize} \begin{itemize}
\item Alle Achsen m\"ussen eine Bezeichnung und eine Einheit erhalten\\ \item Alle Achsen m\"ussen eine Bezeichnung und eine Einheit erhalten\\
(z.B. \code{xlabel('Geschwindigkeit [m/s]'}). (z.B. \code[xlabel()]{xlabel('Geschwindigkeit [m/s]'}).
\item Wenn mehrere Dinge in einem Plot dargestellt werden, m\"ussen \item Wenn mehrere Dinge in einem Plot dargestellt werden, m\"ussen
diese mit einer Legende oder \"ahnlichem benannt werden diese mit einer Legende oder \"ahnlichem benannt werden
\matlabfun{legend()}. \matlabfun{legend()}.
\item Mehrere Plots mit den gleichen Gr\"o{\ss}en auf den Achsen, \item Mehrere Plots mit den gleichen Gr\"o{\ss}en auf den Achsen,
m\"ussen den gleichen Wertebereich auf den Achsen zeigen m\"ussen den gleichen Wertebereich auf den Achsen zeigen
(z.B. \code{xlim([0 100])}.\\ (z.B. \code[xlim()]{xlim([0 100])}.\\
Ausnahmen sind m\"oglich, sollten aber in der Ausnahmen sind m\"oglich, sollten aber in der
Abbildungsunterschrift erw\"ahnt werden. Abbildungsunterschrift erw\"ahnt werden.
\item Die Beschriftung mu{\ss} gro{\ss} genug sein, um lesbar zu sein. \item Die Beschriftung mu{\ss} gro{\ss} genug sein, um lesbar zu sein.
@ -142,13 +142,30 @@ darzustellen (\figref{misleadingsymbolsfig}).
\section{Das Plottingsystem von \matlab{}} \section{Das Plottingsystem von \matlab{}}
Plotten in \matlab{} ist zun\"achst einmal einfach. Durch den Aufruf Plotten in \matlab{} ist zun\"achst einmal einfach. Durch den Aufruf
von \code{plot(x, y)} wird ein einfacher, schlichter Linienplot von \code[plot()]{plot(x, y)} wird ein einfacher, schlichter Linienplot
erstellt. Diesem Plot fehlen jedoch jegliche Annotationen wie erstellt. Diesem Plot fehlen jedoch jegliche Annotationen wie
Achsbeschriftungen, Legenden, etc. Es gibt zwei M\"oglichkeiten diese Achsbeschriftungen, Legenden, etc. Es gibt zwei M\"oglichkeiten diese
hinzuzuf\"ugen: (i) das Graphische User Interface oder (ii) die hinzuzuf\"ugen: (i) das Graphische User Interface oder (ii) die
Kommandozeile. Beide haben ihre Berechtigung sowie Vor- und Kommandozeile. Beide haben ihre Berechtigung sowie Vor- und
Nachteile. Nachteile.
\begin{figure}
\begin{minipage}[t]{0.6\textwidth}
\includegraphics[height=0.29\textheight]{plot_editor}
\end{minipage}
\begin{minipage}[t]{0.3\textwidth}
\includegraphics[height=0.29\textheight]{property_editor}
\end{minipage}
\titlecaption{Der \matlab{} Plot-Editor.}{\"Uber das Menu
``Tools $\rightarrow$ Edit Plot'' erreicht man den Plot Editor. Je nachdem
welches Element des Plots ausgew\"ahlt wurde, ver\"andern sich
die Einstellungsm\"oglichkeiten. Weitere Eigenschaften und
Einstellungen k\"onnen \"uber den ``Property Editor'', rechts,
eingesehen und ver\"andert werden. Der ``Property Editor'' ist
\"uber die Schaltfl\"ache ``More Properties''
erreichbar.}\label{ploteditorfig}
\end{figure}
W\"ahrend es bequem ist, die Abbildung mit der GUI W\"ahrend es bequem ist, die Abbildung mit der GUI
(\figref{ploteditorfig}) zu bearbeiten sind die erhaltenen Ergebnisse (\figref{ploteditorfig}) zu bearbeiten sind die erhaltenen Ergebnisse
nicht einfach reproduzierbar oder \"ubertragbar. Wenn eine Abbildung nicht einfach reproduzierbar oder \"ubertragbar. Wenn eine Abbildung
@ -156,37 +173,20 @@ korrigiert werden musss, wird es schwierig und zeitaufwendig.
Plots in \matlab{} bestehen aus mehreren Elementen: Plots in \matlab{} bestehen aus mehreren Elementen:
\begin{enumerate} \begin{enumerate}
\item \enterm{Figure}: Dieses Element stellt die gesamte \item \enterm[figure]{Figure}: Dieses Element stellt die gesamte
Zeichenf\"ache, das Blatt Papier, dar. Zeichenf\"ache, das Blatt Papier, dar.
\item \enterm{Axes}: Das Koordinatensystem in welches gezeichnet wird. \item \enterm[axes]{Axes}: Das Koordinatensystem in welches gezeichnet wird.
\item \enterm{Lines}: Die gezeichneten Datenplots wie Linien, \item \enterm[lines]{Lines}: Die gezeichneten Datenplots wie Linien,
Fl\"achen, etc. Fl\"achen, etc.
\item \enterm{Annotations}: Annotationen wie Textboxen oder auch \item \enterm[annotations]{Annotations}: Annotationen wie Textboxen
Pfeile, die zum Hervorheben von Punkten, oder Abschnitten gedacht oder auch Pfeile, die zum Hervorheben von Punkten, oder Abschnitten
sind. gedacht sind.
\item \enterm{Legends}: Legenden der Datenplots. \item \enterm[legends]{Legends}: Legenden der Datenplots.
\end{enumerate} \end{enumerate}
Jedes dieser Elemente bietet eine Vielzahl von Jedes dieser Elemente bietet eine Vielzahl von
Einstellungsm\"oglichkeiten. Wie schon erw\"ahnt, k\"onnen diese Einstellungsm\"oglichkeiten. Wie schon erw\"ahnt, k\"onnen diese
\"uber die GUI (Abbildung \ref{ploteditorfig}) bearbeitet werden. \"uber die GUI (Abbildung \ref{ploteditorfig}) bearbeitet werden.
\begin{figure}
\begin{minipage}[t]{0.6\columnwidth}
\includegraphics[width=0.9\textwidth]{plot_editor}
\end{minipage}
\begin{minipage}[t]{0.3\columnwidth}
\includegraphics[width=0.9\textwidth]{property_editor}
\end{minipage}
\titlecaption{Graphisches Interface ``Plot Editor''.}{\"Uber das Menu
``Tools $\rightarrow$ Edit Plot'' erreicht man den Plot Editor. Je nachdem
welches Element des Plots ausgew\"ahlt wurde, ver\"andern sich
die Einstellungsm\"oglichkeiten. Weitere Eigenschaften und
Einstellungen k\"onnen \"uber den ``Property Editor'', rechts,
eingesehen und ver\"andert werden. Der ``Property Editor'' ist
\"uber die Schaltfl\"ache ``More Properties''
erreichbar.}\label{ploteditorfig}
\end{figure}
Alle Einstellungen, die \"uber das graphische Interface vorgenommen Alle Einstellungen, die \"uber das graphische Interface vorgenommen
werden k\"onnen, sind auch \"uber Befehle auf der Kommandozeile werden k\"onnen, sind auch \"uber Befehle auf der Kommandozeile
m\"oglich. Auf diese Weise k\"onnen Einstellungen problemlos in ein m\"oglich. Auf diese Weise k\"onnen Einstellungen problemlos in ein
@ -212,9 +212,9 @@ Datens\"atzen erstellt werden soll.
\subsection{Einfaches Plotten} \subsection{Einfaches Plotten}
Einen einfachen Linienplot zu erstellen ist denkbar Einen einfachen Linienplot zu erstellen ist denkbar
einfach. Angenommen, es existiert einer Variable \code{y} im einfach. Angenommen, es existiert einer Variable \varcode{y} im
\enterm{Workspace}, die die darzustellenden Daten enth\"alt. Es \enterm{Workspace}, die die darzustellenden Daten enth\"alt. Es
gen\"ugt folgender Funktionsaufruf: \code{plot(y)}. Wenn bislang noch gen\"ugt folgender Funktionsaufruf: \code[plot()]{plot(y)}. Wenn bislang noch
keine Abbildung erstellt wurde, \"offnet \matlab{} ein neues Fenster keine Abbildung erstellt wurde, \"offnet \matlab{} ein neues Fenster
und stellt die Daten als Linienplot dar. Dabei werden die Datenpunkte und stellt die Daten als Linienplot dar. Dabei werden die Datenpunkte
durch eine Linie verbunden. Die Messpunkte selbst sind nicht durch eine Linie verbunden. Die Messpunkte selbst sind nicht
@ -223,14 +223,14 @@ ersetzt. Das Festhalten von bestehenden Plots kann an- oder abgestellt
werden indem \code{hold on} bzw. \code{hold off} vor dem \code{plot()} werden indem \code{hold on} bzw. \code{hold off} vor dem \code{plot()}
Befehl aufgerufen wird. Befehl aufgerufen wird.
Im obigen Plot Aufruf wird nur ein Argument, das \code{y}, an die Im obigen Plot Aufruf wird nur ein Argument, das \varcode{y}, an die
Funktion \code{plot} \"ubergeben. \code{plot} erh\"alt nur die Funktion \code{plot()} \"ubergeben. \code{plot()} erh\"alt nur die
y-Werte. \matlab{} substituiert in diesem Fall die fehlenden x-Werte, y-Werte. \matlab{} substituiert in diesem Fall die fehlenden x-Werte,
indem eine Schrittweite von 1 angenommen wird. Die x-Achse reicht also indem eine Schrittweite von 1 angenommen wird. Die x-Achse reicht also
von 1 bis zur L\"ange des Vektors \code{y}. Diese Skalierung der von 1 bis zur L\"ange des Vektors \varcode{y}. Diese Skalierung der
x-Achse ist nur in den wenigsten F\"allen erw\"unscht. Besser ist es, x-Achse ist nur in den wenigsten F\"allen erw\"unscht. Besser ist es,
die zugeh\"origen x-Werte explixit zu \"ubergeben und so z.B. die die zugeh\"origen x-Werte explixit zu \"ubergeben und so z.B. die
y-Werte als Funktion der Zeit darzustellen (\code{plot(x, y)}). y-Werte als Funktion der Zeit darzustellen (\code[plot()]{plot(x, y)}).
Standard\"a{\ss}ig wird der erste Lininenplot in blau, mit Standard\"a{\ss}ig wird der erste Lininenplot in blau, mit
durchgezogener Linie, ohne Marker und der Strichst\"arke 1 durchgezogener Linie, ohne Marker und der Strichst\"arke 1
dargestellt. Der zweite Linienplot erh\"alt automatisch die Farbe dargestellt. Der zweite Linienplot erh\"alt automatisch die Farbe
@ -241,64 +241,54 @@ Farben ist vordefiniert kann aber durch das Setzen einer
die Farbe und die verschiedenen Marker. die Farbe und die verschiedenen Marker.
\begin{table}[tp] \begin{table}[tp]
\titlecaption{Vordefinierte Linienstile (links), Farben (Mitte) und Markersymbole (rechts).}{}\label{plotlinestyles} \titlecaption{Vordefinierte Linienstile (links), Farben (Mitte) und Markersymbole (rechts).}{}\label{plotlinestyles}
\begin{minipage}[t]{0.3\textwidth} \begin{tabular}[t]{lc} \hline
\vspace{0pt} \textbf{Linienstil} & \textbf{K\"urzel} \erh \\\hline
\begin{tabular}{lc} \hline durchgezogen & '\verb|-|' \erb \\
\textbf{Linienstil} & \textbf{K\"urzel} \\\hline gestrichelt & '\verb|--|' \\
durchgezogen & '\verb|-|' \\ gepunktet & '\verb|:|' \\
gestrichelt & '\verb|--|' \\ Strichpunkte & '\verb|.-|' \\\hline
gepunktet & '\verb|:|' \\ \end{tabular}
Strichpunkte & '\verb|.-|' \\\hline \hfill
\end{tabular} \begin{tabular}[t]{lc} \hline
\end{minipage} \textbf{Farbe} & \textbf{K\"urzel} \erh \\ \hline
\vspace{0pt} Rot & 'r' \erb \\
\begin{minipage}[t]{.3\textwidth} Gr\"un & 'g' \\
\vspace{0pt} Blau & 'b' \\
\hspace{0.05\textwidth} Cyan & 'c' \\
\begin{tabular}{lc} \hline Magenta & 'm' \\
\textbf{Farbe} & \textbf{K\"urzel} \\ \hline Gelb & 'y' \\
Rot & 'r'\\ Schwarz & 'k' \\ \hline
Gr\"un & 'g' \\ \end{tabular}
Blau & 'b' \\ \hfill
Cyan & 'c' \\ \begin{tabular}[t]{lc} \hline
Magenta & 'm' \\ \textbf{Markersymbol} & \textbf{K\"urzel} \erh \\ \hline
Gelb & 'y' \\ Kreis & 'o' \erb \\
Schwarz & 'k' \\ \hline Stern & '*' \\
\end{tabular} Plus & '+' \\
\end{minipage} Kreuz & 'x' \\
\vspace{0pt} Diamant & 'd' \\
\begin{minipage}[t]{0.3\textwidth} Pentagramm & 'p' \\
\vspace{0pt} Hexagramm & 'h' \\
\begin{tabular}{lc} \hline Quadrat & 's' \\
\textbf{Markersymbol} & \textbf{K\"urzel} \\ \hline Dreieck & '\^{}' \\
Kreis & 'o'\\ Umgekehrtes Dreieck & 'v' \\
Stern & '*' \\ Dreieck links & '$<$'\\
Plus & '+' \\ Dreieck rechts & '$>$'\\\hline
Kreuz & 'x' \\ \end{tabular}
Diamant & 'd' \\
Pentagramm & 'p' \\
Hexagramm & 'h' \\
Quadrat & 's' \\
Dreieck & '\^{}' \\
Umgekehrtes Dreieck & 'v' \\
Dreieck links & '$<$'\\
Dreieck rechts & '$>$'\\\hline
\end{tabular}
\end{minipage}
\end{table} \end{table}
\subsection{Ver\"andern von Linieneigenschaften} \subsection{Ver\"andern von Linieneigenschaften}
Die Eigenschaften des Linienplots k\"onnen \"uber weitere Argumente Die Eigenschaften des Linienplots k\"onnen \"uber weitere Argumente
des \code{plot} Befehls ver\"andert werden. Folgender Aufruf (Listing der \code{plot()} Funktion ver\"andert werden. Folgender Aufruf (Listing
\ref{settinglineprops})erzeugt einen roten Linienplot mit gepunkteter \ref{settinglineprops})erzeugt einen roten Linienplot mit gepunkteter
Linie der St\"arke 1.5 und Sternmarkern an den Positionen der Linie der St\"arke 1.5 und Sternmarkern an den Positionen der
Datenpunkte. Zus\"atzlich wird noch die Eigenschaft Datenpunkte. Zus\"atzlich wird noch die Eigenschaft
\codeterm{displayname} gesetzt, um dem Linienplot einen Namen zu \code{displayname} gesetzt, um dem Linienplot einen Namen zu
geben, der in einer Legende verwendet werden kann. geben, der in einer Legende verwendet werden kann.
\begin{lstlisting}[label=settinglineprops, caption={Setzen von Linieneigenschaften beim \code{plot} Aufruf}] \begin{lstlisting}[label=settinglineprops, caption={Setzen von Linieneigenschaften beim \varcode{plot} Aufruf}]
x = 0:0.1:2*pi; x = 0:0.1:2*pi;
y = sin(x); y = sin(x);
plot( x, y, 'color', 'r', 'linestyle', ':', 'marker', '*', 'linewidth', 1.5, 'displayname', 'plot 1') plot( x, y, 'color', 'r', 'linestyle', ':', 'marker', '*', 'linewidth', 1.5, 'displayname', 'plot 1')
@ -307,46 +297,47 @@ geben, der in einer Legende verwendet werden kann.
\subsection{Ver\"andern von Achseneigenschaften} \subsection{Ver\"andern von Achseneigenschaften}
Das erste, was ein Plot zus\"atzlich braucht, ist eine Das erste, was ein Plot zus\"atzlich braucht, ist eine
Achsenbeschriftung. Mithilfe der Funktionen \code{xlabel('Time [ms]')} Achsenbeschriftung. Mithilfe der Funktionen \code[xlabel()]{xlabel('Time [ms]')}
und \code{ylabel('Voltage [V]')} k\"onnen diese gesetzt und \code[ylabel()]{ylabel('Voltage [V]')} k\"onnen diese gesetzt
werden. werden.
Standardm\"a{\ss}ig setzt Matlab die Grenzen der x- und y-Achse so, Standardm\"a{\ss}ig setzt Matlab die Grenzen der x- und y-Achse so,
dass die Daten hineinpassen. Dabei wird meist auf den n\"achsten dass die Daten hineinpassen. Dabei wird meist auf den n\"achsten
ganzzahligen Wert aufgerundet. Mit den Funktionen \code{xlim} und ganzzahligen Wert aufgerundet. Mit den Funktionen \code{xlim()} und
\code{ylim} k\"onnen die Grenezen der Achsen aber auch manuell \code{ylim()} k\"onnen die Grenezen der Achsen aber auch manuell
eingestellt werden. Die Funktionen \code{xlim} und \code{ylim} eingestellt werden. Die Funktionen \code{xlim()} und \code{ylim()}
erwarten als Argument einen 2-elementigen Vektor mit dem Minimum und erwarten als Argument einen 2-elementigen Vektor mit dem Minimum und
dem Maximum der jeweiligen Achse. Tabelle \ref{plotaxisprops} listet dem Maximum der jeweiligen Achse. Tabelle \ref{plotaxisprops} listet
weitere h\"aufig genutzte Einstellungen der Achsen. Mit der \code{set} weitere h\"aufig genutzte Einstellungen der Achsen. Mit der
- Funktion k\"onnen diese ver\"andert werden wie in Zeile 15 in \code{set()} - Funktion k\"onnen diese ver\"andert werden wie in Zeile
Listing \ref{niceplotlisting} gezeigt. Die \code{set} - Funktion 15 in Listing \ref{niceplotlisting} gezeigt. Die \code{set()} -
erwartet als erstes Argument ein sogenanntes Handle der Achse, dieses Funktion erwartet als erstes Argument ein sogenanntes Handle der
wird gefolgt von einer beliebig langen Reihe von Eigenschaft-Wert Achse, dieses wird gefolgt von einer beliebig langen Reihe von
Paaren. Soll z.B. das Gitternetz der x-Achse gezeigt werden, wird die Eigenschaft-Wert Paaren. Soll z.B. das Gitternetz der x-Achse gezeigt
Eigenschaft \codeterm{XGrid} auf den Wert \codeterm{'on'} gesetzt: werden, wird die Eigenschaft \code{XGrid} auf den Wert
\code{set(gca, 'XGrid', 'on');}. Das erste Argument ist ein Aufruf der \varcode{'on'} gesetzt: \code[set()!set(gca, 'XGrid',
Funktion \code{gca}, ``get-current-axis'' und ist das Achsenhandle der 'on')]{set(gca, 'XGrid', 'on');}. Das erste Argument ist ein Aufruf
gerade aktiven Achse. der Funktion \code{gca}, \enterm{get-current-axis} und ist das Achsenhandle
der gerade aktiven Achse.
\begin{table}[tp] \begin{table}[tp]
\titlecaption{Ausgew\"ahlte Eigenschaften der Achse.}{ Alle Eigenschaften der Achse findet man in der Hilfe oder im \codeterm{Property Editor} (\figref{ploteditorfig}). Wenn es eine definierte Auswahl von Einstellungen gibt, z.B. bei der Eigenschaft \codeterm{Box}, dann ist die Standardeinstellungen als erstes gelistet.}\label{plotaxisprops} \titlecaption{Ausgew\"ahlte Eigenschaften der Achse.}{ Alle Eigenschaften der Achse findet man in der Hilfe oder im \codeterm{Property Editor} (\figref{ploteditorfig}). Wenn es eine definierte Auswahl von Einstellungen gibt, z.B. bei der Eigenschaft \code{Box}, dann ist die Standardeinstellungen als erstes gelistet.}\label{plotaxisprops}
\begin{tabular*}{1\textwidth}{lp{6.3cm}p{6cm}} \hline \begin{tabular*}{1\textwidth}{lp{5.8cm}p{5.5cm}} \hline
\textbf{Eigenschaft} & \textbf{Beschreibung} & \textbf{Optionen} \\ \hline \textbf{Eigenschaft} & \textbf{Beschreibung} & \textbf{Optionen} \erh \\ \hline
\codeterm{Box} & Definiert, ob der Rahmen der Achse vollst\"andig gezeichnet wird. & $\{'on'|'off'\}$ \\ \code{Box} & Definiert, ob der Rahmen der Achse vollst\"andig gezeichnet wird. & $\{'on'|'off'\}$ \erb \\
\codeterm{Color} & Hintergrundfarbe des Koordinatensystems. & Beliebige RGB, CMYK ... Werte. \\ \code{Color} & Hintergrundfarbe des Koordinatensystems. & Beliebige RGB, CMYK Werte. \\
\codeterm{Fontname} & Der Name der Schriftart. & Im System installierte Schriften. \\ \code{Fontname} & Der Name der Schriftart. & Im System installierte Schriften. \\
\codeterm{FontSize} & Gr\"o{\ss}e der Schrift. & Skalarer Wert.\\ \code{FontSize} & Gr\"o{\ss}e der Schrift. & Skalarer Wert.\\
\codeterm{FontUnit} & Einheit, in der die Schriftgr\"o{\ss}e bestimmt wird. & $\{'points' | 'centimeters' | 'inches', ...\}$\\ \code{FontUnit} & Einheit, in der die Schriftgr\"o{\ss}e bestimmt wird. & $\{'points' | 'centimeters' | 'inches', ...\}$\\
\codeterm{FontWeight} & Fett- oder Normalsatz der Schrift. & $\{'normal' | 'bold'\}$\\ \code{FontWeight} & Fett- oder Normalsatz der Schrift. & $\{'normal' | 'bold'\}$\\
% & 'd' \\ ?????? % & 'd' \\ ??????
\codeterm{TickDir} & Richtung der Teilstriche auf der Achse. & $\{'in' | 'out'\}$\\ \code{TickDir} & Richtung der Teilstriche auf der Achse. & $\{'in' | 'out'\}$\\
\codeterm{TickLength} & L\"ange der Haupt- und Nebenteilstriche & \\ \code{TickLength} & L\"ange der Haupt- und Nebenteilstriche & \\
\codeterm{X-, Y-, ZDir} & Richtung der Achsskalierung. & $\{'normal' | 'reversed'\}$\\ \code{X-, Y-, ZDir} & Richtung der Achsskalierung. & $\{'normal' | 'reversed'\}$\\
\codeterm{X-, Y-, ZGrid} & Sollen Gitternetzlinien gezeigt werden? & $\{'off'|'on'\}$ \\ \code{X-, Y-, ZGrid} & Sollen Gitternetzlinien gezeigt werden? & $\{'off'|'on'\}$ \\
\codeterm{X-, Y-, ZScale} & Lineare oder logarithmische Skalierung der Achse. & $\{'linear' | 'log'\}$\\ \code{X-, Y-, ZScale} & Lineare oder logarithmische Skalierung der Achse. & $\{'linear' | 'log'\}$\\
\codeterm{X-, Y-, ZTick} & Position der Teilstriche auf der Achse. & Vektor mit Positionen.\\ \code{X-, Y-, ZTick} & Position der Teilstriche auf der Achse. & Vektor mit Positionen.\\
\codeterm{X-, Y-, ZTickLabel} & Beschriftung der Teilstriche. & Vektor mit entsprechenden Zahlen oder Cell-Array mit Strings.\\ \hline \code{X-, Y-, ZTickLabel} & Beschriftung der Teilstriche. & Vektor mit entsprechenden Zahlen oder Cell-Array mit Strings.\\ \hline
\end{tabular*} \end{tabular*}
\end{table} \end{table}
@ -354,19 +345,19 @@ gerade aktiven Achse.
\subsection{Ver\"andern von Figure-Einstellungen} \subsection{Ver\"andern von Figure-Einstellungen}
\begin{table}[tp] \begin{table}[tp]
\titlecaption{Ausgew\"ahlte Eigenschaften der \codeterm{Figure}.}{Alle Eigenschaften der Figure findet man in der Hilfe von \matlab{} oder im \codeterm{Property Editor} wenn die Abbildung ausgew\"ahlt wurde (\figref{ploteditorfig}).}\label{plotfigureprops} \titlecaption{Ausgew\"ahlte Eigenschaften der Figure.}{Alle Eigenschaften der \enterm[figure]{Figure} findet man in der Hilfe von \matlab{} oder im \codeterm{Property Editor} wenn die Abbildung ausgew\"ahlt wurde (\figref{ploteditorfig}).}\label{plotfigureprops}
\begin{tabular*}{1\textwidth}{lp{6.3cm}p{6cm}} \hline \begin{tabular*}{1\textwidth}{lp{6.6cm}p{5.7cm}} \hline
\textbf{Eigenschaft} & \textbf{Beschreibung} & \textbf{Optionen} \\ \hline \textbf{Eigenschaft} & \textbf{Beschreibung} & \textbf{Optionen} \erh \\ \hline
\codeterm{Color} & Hintergrundfarbe der Zeichenfl\"ache. & Beliebige RGB, CMYK ... Werte. \\ \code{Color} & Hintergrundfarbe der Zeichenfl\"ache. & Beliebige RGB, CMYK Werte. \erb \\
\codeterm{PaperPosition} & Position der Abbildung auf dem Papier & 4-elementiger Vektor mit den Positionen der linken-unteren, und rechten-oberen Ecke. \\ \code{PaperPosition} & Position der Abbildung auf dem Papier & 4-elementiger Vektor mit den Positionen der linken-unteren, und rechten-oberen Ecke. \\
\codeterm{PaperSize} & Gr\"o{\ss}e der des Papiers. & 2-elementiger Vektor mit der Papiergr\"o{\ss}e.\\ \code{PaperSize} & Gr\"o{\ss}e der des Papiers. & 2-elementiger Vektor mit der Papiergr\"o{\ss}e.\\
\codeterm{PaperUnits} & Einheit, in der die Papiergr\"o{\ss}e bestimmt wird. & $\{'inches' | 'centimeters' | 'normalized' | 'points'\}$\\ \code{PaperUnits} & Einheit, in der die Papiergr\"o{\ss}e bestimmt wird. & $\{'inches' | 'centimeters' | 'normalized' | 'points'\}$\\
\codeterm{Visible} & Hilfreich, wenn ein Plot aus Performanzgr\"unden nicht auf dem Bildschirm gezeigt, sondern direkt gespeichert werden soll. & $\{'on' | 'off'\}$\\ \hline \code{Visible} & Hilfreich, wenn ein Plot aus Performanzgr\"unden nicht auf dem Bildschirm gezeigt, sondern direkt gespeichert werden soll. & $\{'on' | 'off'\}$\\ \hline
\end{tabular*} \end{tabular*}
\end{table} \end{table}
Wie die Achse, hat auch das \codeterm{Figure} Element eine Reihe von Wie die Achse, hat auch das \codeterm{Figure} Element eine Reihe von
Eigenschaften, die nach Bedarf mit der \code{set} - Funktion gesetzt Eigenschaften, die nach Bedarf mit der \code{set()} - Funktion gesetzt
werden k\"onnen (Tabelle \ref{plotfigureprops} listet die werden k\"onnen (Tabelle \ref{plotfigureprops} listet die
meistverwendeten). Das erste Argument f\"ur \code{set()} ist jetzt meistverwendeten). Das erste Argument f\"ur \code{set()} ist jetzt
aber eine Handle f\"ur die Abbildung, nicht das aber eine Handle f\"ur die Abbildung, nicht das
@ -380,25 +371,17 @@ Aufruf des Skripts wird exakt der gleiche Plot (Abbildung
sind hier vor allem die Zeilen 2 und 3 in denen die Gr\"o{\ss}e der sind hier vor allem die Zeilen 2 und 3 in denen die Gr\"o{\ss}e der
Abbildung in Zentimetern definiert wird. In Zeile 16 wird die Abbildung in Zentimetern definiert wird. In Zeile 16 wird die
Abbildung dann in genau der angegebenen Gr\"o{\ss}e im ``pdf'' Format Abbildung dann in genau der angegebenen Gr\"o{\ss}e im ``pdf'' Format
gespeichert. Dazu wird die Funktion \code{saveas} verwendet, die als gespeichert. Dazu wird die Funktion \code{saveas()} verwendet, die als
erstes Argument wieder ein Handle auf die Figure erwartet. Das zweite erstes Argument wieder ein Handle auf die Figure erwartet. Das zweite
Argument ist der Dateiname, und zuletzt muss das gew\"unschte Format Argument ist der Dateiname, und zuletzt muss das gew\"unschte Format
(Box \ref{graphicsformatbox}) angegeben werden. (Box \ref{graphicsformatbox}) angegeben werden.
\lstinputlisting[caption={Skript zur Erstellung des Plots in \figref{spikedetectionfig}.}, label=niceplotlisting]{automatic_plot.m}
\begin{figure}[t] \begin{figure}[t]
\includegraphics{spike_detection} \includegraphics{spike_detection}
\titlecaption{Automatisch erstellter Plot.}{Dieser Plot wurde vollst\"andig \titlecaption{Automatisch erstellter Plot.}{Dieser Plot wurde vollst\"andig
mit dem Skript in Listing \ref{niceplotlisting} erstellt und mit dem Skript in Listing \ref{niceplotlisting} erstellt und
gespeichert.}\label{spikedetectionfig} gespeichert.}\label{spikedetectionfig}
\end{figure} \end{figure}
Neben den Standard-Linienplots gibt es eine ganze Reihe weiterer
M\"oglichkeiten Daten zu Visualisieren. Mathworks zeigt auf seiner
Homepage viele Beispiele mit zugeh\"origem Code
\url{http://www.mathworks.de/discovery/gallery.html}.
\begin{ibox}[t]{\label{graphicsformatbox}Dateiformate f\"ur Abbildungen.} \begin{ibox}[t]{\label{graphicsformatbox}Dateiformate f\"ur Abbildungen.}
Es gibt zwei grunds\"atzlich verschiedene Arten von Dateiformaten f\"ur Es gibt zwei grunds\"atzlich verschiedene Arten von Dateiformaten f\"ur
Graphiken: Graphiken:
@ -406,7 +389,6 @@ Homepage viele Beispiele mit zugeh\"origem Code
\item \determ{Rastergraphik} (\enterm{bitmap}) \item \determ{Rastergraphik} (\enterm{bitmap})
\item \determ{Vektorgraphik} (\enterm{vector graphics}) \item \determ{Vektorgraphik} (\enterm{vector graphics})
\end{enumerate} \end{enumerate}
Bei Rastergraphiken wird f\"ur jeden Bildpunkt (jedes Pixel) der Bei Rastergraphiken wird f\"ur jeden Bildpunkt (jedes Pixel) der
aktuelle Farbwert angegeben. Rastergraphiken haben eine bestimmte aktuelle Farbwert angegeben. Rastergraphiken haben eine bestimmte
Aufl\"osung (z.B. 300\,dpi --- dots per inch). Sie sind vor allem Aufl\"osung (z.B. 300\,dpi --- dots per inch). Sie sind vor allem
@ -415,29 +397,27 @@ Homepage viele Beispiele mit zugeh\"origem Code
Polygone, ...) beschrieben. Der Vorteil der Vektorgraphiken Polygone, ...) beschrieben. Der Vorteil der Vektorgraphiken
ist die Skalierbakeit ohne Qualit\"atsverlust. ist die Skalierbakeit ohne Qualit\"atsverlust.
\vspace{1ex}
\begin{minipage}[t]{0.38\textwidth} \begin{minipage}[t]{0.38\textwidth}
\mbox{}\\[-2ex] \mbox{}\\[-2ex]
\includegraphics[width=0.93\textwidth]{VectorBitmap.pdf} \includegraphics[width=0.85\textwidth]{VectorBitmap.pdf}
\rotatebox{90}{\footnotesize by Darth Stabro at en.wikipedia.org} \rotatebox{90}{\footnotesize by Darth Stabro at en.wikipedia.org}
\end{minipage} \end{minipage}
\hfill \hfill
\begin{minipage}[t]{0.5\textwidth} \begin{minipage}[t]{0.5\textwidth}
Von \matlab{} unterst\"utzte Formate\footnote{Auswahl, mehr Information in der Hilfe zu \code{saveas}}:\\[2ex] Von \matlab{} unterst\"utzte Formate\footnote{mehr Information in der Hilfe zu \code{saveas()}}:\\[2ex]
\begin{tabular}{|l|c|l|} \begin{tabular}{|l|c|l|}
\hline \hline
\textbf{Format} & \textbf{Typ} & \code{saveas} Argument \rule[-1.2ex]{0pt}{3.5ex} \\ \hline \textbf{Format} & \textbf{Typ} & \code{saveas()} Argument \erh \\ \hline
pdf & Vektor & \codeterm{'pdf'} \rule{0pt}{2.5ex} \\ pdf & Vektor & \varcode{'pdf'} \erb \\
eps & Vektor & \codeterm{'eps', 'epsc'} \\ eps & Vektor & \varcode{'eps'}, \varcode{'epsc'} \\
SVG & Vektor & \codeterm{'svg'} \\ SVG & Vektor & \varcode{'svg'} \\
PS & Vektor & \codeterm{'ps', 'psc'} \\ PS & Vektor & \varcode{'ps'}, \varcode{'psc'} \\
jpg & Bitmap & \codeterm{'jpeg'} \\ jpg & Bitmap & \varcode{'jpeg'} \\
tif & Bitmap & \codeterm{'tiff', 'tiffn'} \\ tif & Bitmap & \varcode{'tiff'}, \varcode{'tiffn'} \\
png & Bitmap & \codeterm{'png'} \\ png & Bitmap & \varcode{'png'} \\
bmp & Bitmap & \codeterm{'bmp'} \\ \hline bmp & Bitmap & \varcode{'bmp'} \\ \hline
\end{tabular} \end{tabular}
\end{minipage} \end{minipage}
\vspace{1ex}
Wenn aus \matlab{} heraus Graphiken gespeichert werden sollen, dann Wenn aus \matlab{} heraus Graphiken gespeichert werden sollen, dann
ist es meistens sehr sinnvoll sie als Vektorgraphik zu speichern. Im ist es meistens sehr sinnvoll sie als Vektorgraphik zu speichern. Im
@ -449,6 +429,13 @@ Homepage viele Beispiele mit zugeh\"origem Code
Rastergraphik allerdings deutlich schneller und speichereffizienter. Rastergraphik allerdings deutlich schneller und speichereffizienter.
\end{ibox} \end{ibox}
\lstinputlisting[caption={Skript zur Erstellung des Plots in \figref{spikedetectionfig}.}, label=niceplotlisting]{automatic_plot.m}
Neben den Standard-Linienplots gibt es eine ganze Reihe weiterer
M\"oglichkeiten Daten zu Visualisieren. Mathworks zeigt auf seiner
Homepage viele Beispiele mit zugeh\"origem Code
\url{http://www.mathworks.de/discovery/gallery.html}.
\section{Fazit} \section{Fazit}

View File

@ -1,19 +1,24 @@
function [time, rate] = binnedRate(spike_times, bin_width, dt, t_max) function [time, rate] = binned_rate(spikes, bin_width, dt, t_max)
% Calculates the firing rate with the binning method. The hist % PSTH computed with binning method.
% function is used to count the number of spikes in each bin. % The hist funciton is used to count the number of spikes in each bin.
%
% [time, rate] = binned_rate(spikes, bin_width, dt, t_max)
%
% Arguments: % Arguments:
% spike_times, vector containing the times of the spikes. % spikes : vector containing the times of the spikes.
% bin_width, the width of the bins in seconds. % bin_width: the width of the bins in seconds.
% dt, the temporal resolution. % dt : the temporal resolution.
% t_max, the tiral duration. % t_max : the tiral duration.
% %
% Returns two vectors containing the time and the rate. % Returns:
% two vectors containing the time and the rate.
time = 0:dt:t_max-dt; time = 0:dt:t_max-dt;
bins = 0:bin_width:t_max; bins = 0:bin_width:t_max;
rate = zeros(size(time)); rate = zeros(size(time));
h = hist(spikes, bins) ./ bin_width;
h = hist(spike_times, bins) ./ bin_width; for i = 2:length(bins)
for i = 2:length(bins) rate(round(bins(i - 1) / dt) + 1:round(bins(i) / dt)) = h(i);
rate(round(bins(i - 1) / dt) + 1:round(bins(i) / dt)) = h(i); end
end end

View File

@ -1,17 +1,20 @@
function [time, rate] = convolutionRate(spike_times, sigma, dt, t_max) function [time, rate] = convolution_rate(spikes, sigma, dt, t_max)
% Calculates the firing rate with the convolution method. % PSTH computed with convolution method.
%
% [time, rate] = convolution_rate(spikes, sigma, dt, t_max)
%
% Arguments: % Arguments:
% spike_times, a vector containing the spike times. % spikes: a vector containing the spike times.
% sigma, the standard deviation of the Gaussian kernel % sigma : the standard deviation of the Gaussian kernel in seconds.
% in seconds. % dt : the temporal resolution in seconds.
% dt, the temporal resolution in seconds. % t_max : the trial duration in seconds.
% t_max, the trial duration in seconds.
% %
% Returns two vectors containing the time and the rate. % Returns:
two vectors containing the time and the rate.
time = 0:dt:t_max - dt; time = 0:dt:t_max - dt;
rate = zeros(size(time)); rate = zeros(size(time));
spike_indices = round(spike_times / dt); spike_indices = round(spikes / dt);
rate(spike_indices) = 1; rate(spike_indices) = 1;
kernel = gaussKernel(sigma, dt); kernel = gaussKernel(sigma, dt);

View File

@ -1,22 +1,24 @@
function [time, rate] = instantaneousRate(spike_times, dt, t_max) function [time, rate] = instantaneous_rate(spikes, dt, t_max)
% Function calculates the firing rate as the inverse of the interspike % Firing rate as the inverse of the interspike interval.
% interval. %
% [time, rate] = instantaneous_rate(spikes, dt, t_max)
%
% Arguments: % Arguments:
% spike_times, vector containing the times of the spikes. % spikes: vector containing the times of the spikes.
% dt, the temporal resolutions of the recording. % dt : the temporal resolutions of the recording.
% t_max, the duration of the trial. % t_max : the duration of the trial.
% %
% Returns two vectors containing the time and the rate. % Returns:
% the vector representing time and a vector containing the rate.
time = 0:dt:t_max-dt; time = 0:dt:t_max-dt;
rate = zeros(size(time)); rate = zeros(size(time));
isis = diff([0 spike_times]); isis = diff([0 spikes]);
inst_rate = 1 ./ isis; inst_rate = 1 ./ isis;
spike_indices = [1 round(spike_times ./ dt)]; spike_indices = [1 round(spikes ./ dt)];
for i = 2:length(spike_indices) for i = 2:length(spike_indices)
rate(spike_indices(i - 1):spike_indices(i)) = inst_rate(i - 1); rate(spike_indices(i - 1):spike_indices(i)) = inst_rate(i - 1);
end
end end

View File

@ -1,7 +1,7 @@
function [pdf, centers] = isi_hist(isis, binwidth) function [pdf, centers] = isiHist(isis, binwidth)
% Compute normalized histogram of interspike intervals. % Compute normalized histogram of interspike intervals.
% %
% [pdf, centers] = isi_hist(isis, binwidth) % [pdf, centers] = isiHist(isis, binwidth)
% %
% Arguments: % Arguments:
% isis: vector of interspike intervals in seconds % isis: vector of interspike intervals in seconds

View File

@ -2,7 +2,12 @@ function isivec = isis( spikes )
% returns a single list of isis computed from all trials in spikes % returns a single list of isis computed from all trials in spikes
% %
% isivec = isis( spikes ) % isivec = isis( spikes )
%
% Arguments:
% spikes: a cell array of vectors of spike times in seconds % spikes: a cell array of vectors of spike times in seconds
% isivec: a column vector with all the interspike intervalls
%
% Returns:
% isivec: a column vector with all the interspike intervalls % isivec: a column vector with all the interspike intervalls
isivec = []; isivec = [];
@ -13,4 +18,3 @@ function isivec = isis( spikes )
isivec = [ isivec; difftimes(:) ]; isivec = [ isivec; difftimes(:) ];
end end
end end

View File

@ -1,7 +1,7 @@
function plot_isi_hist(isis, binwidth) function plotISIHist(isis, binwidth)
% Plot and annotate histogram of interspike intervals. % Plot and annotate histogram of interspike intervals.
% %
% isihist(isis, binwidth) % plotISIHist(isis, binwidth)
% %
% Arguments: % Arguments:
% isis: vector of interspike intervals in seconds % isis: vector of interspike intervals in seconds
@ -9,9 +9,9 @@ function plot_isi_hist(isis, binwidth)
% compute normalized histogram: % compute normalized histogram:
if nargin < 2 if nargin < 2
[pdf, centers] = isi_hist(isis); [pdf, centers] = isiHist(isis);
else else
[pdf, centers] = isi_hist(isis, binwidth); [pdf, centers] = isiHist(isis, binwidth);
end end
% plot: % plot:

View File

@ -1,19 +1,19 @@
function s_est = reconstructStimulus(spike_times, sta, stim_duration, dt) function s_est = reconstructStimulus(spikes, sta, duration, deltat)
% Function estimates the stimulus from the Spike-Triggered-Average % Estimate the stimulus from the spike-triggered-average (STA).
% (sta). %
% s_est = reconstructStimulus(spikes, sta, duration, deltat)
%
% Arguments: % Arguments:
% spike_times, a vector containing the spike times in seconds. % spikes : a vector containing the spike times in seconds.
% sta, a vector containing the spike-triggered-average. % sta : a vector containing the spike-triggered-average.
% stim_duration, the total duration of the stimulus. % duration: the total duration of the stimulus.
% dt, the sampling interval given in seconds. % deltat : the time step of the stimulus in seconds.
% %
% Returns: % Returns:
% the estimated stimulus. % s_est: vector with the estimated stimulus.
s_est = zeros(round(stim_duration / dt), 1);
binary_spikes = zeros(size(s_est));
binary_spikes(round(spike_times ./ dt)) = 1;
s_est = conv(binary_spikes, sta, 'same');
s_est = zeros(round(duration / deltat), 1);
binary_spikes = zeros(size(s_est));
binary_spikes(round(spikes ./ deltat)) = 1;
s_est = conv(binary_spikes, sta, 'same');
end

View File

@ -1,32 +1,31 @@
function [sta, std_sta, valid_spikes] = spikeTriggeredAverage(stimulus, spike_times, count, sampling_rate) function [sta, std_sta, n_spikes] = spikeTriggeredAverage(stimulus, spikes, count, deltat)
% Function estimates the Spike-Triggered-Average (sta). % Estimate the spike-triggered-average (STA).
%
% [sta, std_sta, n_spikes] = spikeTriggeredAverage(stimulus, spikes, count, deltat)
% %
% Arguments: % Arguments:
% stimulus, a vector containing stimulus intensities % stimulus: vector of stimulus intensities as a function of time.
% as a function of time. % spikes : vector with spike times in seconds.
% spike_times, a vector containing the spike times % count : number of datapoints that are taken around the spike times.
% in seconds. % deltat : the time step of the stimulus in seconds.
% count, the number of datapoints that are taken around
% the spike times.
% sampling_rate, the sampling rate of the stimulus.
% %
% Returns: % Returns:
% the sta, a vector containing the staandard deviation and % sta : vector with the STA.
% the number of spikes taken into account. % std_sta : standard deviation of the STA.
% n_spikes: number of spikes contained in STA.
snippets = zeros(numel(spike_times), 2*count); snippets = zeros(numel(spikes), 2*count);
valid_spikes = 1; n_spikes = 0;
for i = 1:numel(spike_times) for i = 1:numel(spikes)
t = spike_times(i); t = spikes(i);
index = round(t*sampling_rate); index = round(t/deltat);
if index <= count || (index + count) > length(stimulus) if index <= count || (index + count) > length(stimulus)
continue continue
end
snippets(n_spikes,:) = stimulus(index-count:index+count-1);
n_spikes = n_spikes + 1;
end end
snippets(valid_spikes,:) = stimulus(index-count:index+count-1); snippets(n_spikes+1:end,:) = [];
valid_spikes = valid_spikes + 1; sta = mean(snippets, 1);
std_sta = std(snippets,[],1);
end end
snippets(valid_spikes:end,:) = [];
sta = mean(snippets, 1);
std_sta = std(snippets,[],1);

View File

@ -1,21 +1,12 @@
BASENAME=pointprocesses BASENAME=pointprocesses
PYFILES=$(wildcard *.py)
PYPDFFILES=$(PYFILES:.py=.pdf)
GPTFILES=$(wildcard *.gpt)
GPTTEXFILES=$(GPTFILES:.gpt=.tex)
all: pdf slides thumbs all: pdf slides thumbs
include ../../chapter.mk
# script: # script:
pdf : $(BASENAME)-chapter.pdf pdf : chapter
$(BASENAME)-chapter.pdf : $(BASENAME)-chapter.tex $(BASENAME).tex ../../header.tex $(GPTTEXFILES) $(PYPDFFILES)
CHAPTER=$$(( $$(sed -n -e '/contentsline {chapter}/{s/.*numberline {\([0123456789]*\)}.*/\1/; p}' $(BASENAME).aux) - 1 )); \
PAGE=$$(sed -n -e '/contentsline {chapter}/{s/.*numberline {.*}.*}{\(.*\)}{chapter.*/\1/; p}' $(BASENAME).aux); \
sed -i -e "s/setcounter{page}{.*}/setcounter{page}{$$PAGE}/; s/setcounter{chapter}{.*}/setcounter{chapter}{$$CHAPTER}/" $(BASENAME)-chapter.tex
pdflatex -interaction=scrollmode $< | tee /dev/stderr | fgrep -q "Rerun to get cross-references right" && pdflatex -interaction=scrollmode $< || true
# slides: # slides:
@ -31,31 +22,15 @@ $(BASENAME)-handout.pdf: $(BASENAME)-slides.tex $(GPTTEXFILES)
pdfnup --nup 2x4 --no-landscape --paper a4paper --trim "-1cm -1cm -1cm -1cm" --outfile $@ thumbsfoils.pdf # 1-19 pdfnup --nup 2x4 --no-landscape --paper a4paper --trim "-1cm -1cm -1cm -1cm" --outfile $@ thumbsfoils.pdf # 1-19
rm thumbsfoils.* rm thumbsfoils.*
watchpdf :
while true; do ! make -q pdf && make pdf; sleep 0.5; done
watchslides : watchslides :
while true; do ! make -q slides && make slides; sleep 0.5; done while true; do ! make -q slides && make slides; sleep 0.5; done
# python plots:
$(PYPDFFILES) : %.pdf: %.py
python $<
# gnuplot plots:
$(GPTTEXFILES) : %.tex: %.gpt whitestyles.gp
gnuplot whitestyles.gp $<
epstopdf $*.eps
clean : clean : cleanchapter
rm -f *~
rm -f $(BASENAME).aux $(BASENAME).log
rm -f $(BASENAME)-chapter.aux $(BASENAME)-chapter.log $(BASENAME)-chapter.out
rm -f $(BASENAME)-slides.aux $(BASENAME)-slides.log $(BASENAME)-slides.out $(BASENAME)-slides.toc $(BASENAME)-slides.nav $(BASENAME)-slides.snm $(BASENAME)-slides.vrb rm -f $(BASENAME)-slides.aux $(BASENAME)-slides.log $(BASENAME)-slides.out $(BASENAME)-slides.toc $(BASENAME)-slides.nav $(BASENAME)-slides.snm $(BASENAME)-slides.vrb
rm -f $(PYPDFFILES) $(GPTTEXFILES)
cleanall : clean cleanall : clean cleanchapter
rm -f $(BASENAME)-chapter.pdf $(BASENAME)-slides.pdf $(BASENAME)-handout.pdf $(BASENAME)-slides.pdf $(BASENAME)-handout.pdf
help : help :

View File

@ -98,4 +98,4 @@ plotisih(ax, isis(inhspikes))
plt.tight_layout() plt.tight_layout()
plt.savefig('isihexamples.pdf') plt.savefig('isihexamples.pdf')
plt.show() plt.close()

View File

@ -5,8 +5,10 @@
\lstset{inputpath=../code} \lstset{inputpath=../code}
\graphicspath{{figures/}} \graphicspath{{figures/}}
\setcounter{page}{111} \typein[\pagenumber]{Number of first page}
\setcounter{chapter}{7} \typein[\chapternumber]{Chapter number}
\setcounter{page}{\pagenumber}
\setcounter{chapter}{\chapternumber}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -14,5 +16,11 @@
\input{pointprocesses} \input{pointprocesses}
\section{TODO}
\begin{itemize}
\item Add spikeraster function
\item Multitrial firing rates
\end{itemize}
\end{document} \end{document}

View File

@ -2,7 +2,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\chapter{Analyse von Spiketrains} \chapter{Analyse von Spiketrains}
\determ{Aktionspotentiale} (\enterm{Spikes}) sind die Tr\"ager der \determ[Aktionspotential]{Aktionspotentiale} (\enterm{spikes}) sind die Tr\"ager der
Information in Nervensystemen. Dabei ist in erster Linie nur der Information in Nervensystemen. Dabei ist in erster Linie nur der
Zeitpunkt des Auftretens eines Aktionspotentials von Bedeutung. Die Zeitpunkt des Auftretens eines Aktionspotentials von Bedeutung. Die
genaue Form des Aktionspotentials spielt keine oder nur eine genaue Form des Aktionspotentials spielt keine oder nur eine
@ -10,13 +10,13 @@ untergeordnete Rolle.
Nach etwas Vorverarbeitung haben elektrophysiologische Messungen Nach etwas Vorverarbeitung haben elektrophysiologische Messungen
deshalb Listen von Spikezeitpunkten als Ergebniss --- sogenannte deshalb Listen von Spikezeitpunkten als Ergebniss --- sogenannte
\enterm{Spiketrains}. Diese Messungen k\"onnen wiederholt werden und \enterm{spiketrains}. Diese Messungen k\"onnen wiederholt werden und
es ergeben sich mehrere \enterm{trials} von Spiketrains es ergeben sich mehrere \enterm{trials} von Spiketrains
(\figref{rasterexamplesfig}). (\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
sogenannten \determ{Punktprozessen}. sogenannten \determ[Punktprozess]{Punktprozessen}.
\begin{figure}[ht] \begin{figure}[ht]
\includegraphics[width=1\textwidth]{rasterexamples} \includegraphics[width=1\textwidth]{rasterexamples}
@ -25,7 +25,9 @@ sogenannten \determ{Punktprozessen}.
(homogener Poisson Prozess mit Rate $\lambda=20$\;Hz, links) und (homogener Poisson Prozess mit Rate $\lambda=20$\;Hz, links) und
eines nicht-station\"aren Punktprozesses (perfect eines nicht-station\"aren Punktprozesses (perfect
integrate-and-fire Neuron getrieben mit Ohrnstein-Uhlenbeck integrate-and-fire Neuron getrieben mit Ohrnstein-Uhlenbeck
Rauschen mit Zeitkonstante $\tau=100$\,ms, rechts).} Rauschen mit Zeitkonstante $\tau=100$\,ms, rechts). Jeder
vertikale Strich markiert den Zeitpunkt eines Ereignisses.
Jede Zeile zeigt die Ereignisse eines trials.}
\end{figure} \end{figure}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -79,11 +81,12 @@ Zeitpunkte der Ereignisse durch senkrechte Striche markiert werden.
Die Intervalle $T_i=t_{i+1}-t_i$ zwischen aufeinanderfolgenden Die Intervalle $T_i=t_{i+1}-t_i$ zwischen aufeinanderfolgenden
Ereignissen sind reelle, positive Zahlen. Bei Aktionspotentialen Ereignissen sind reelle, positive Zahlen. Bei Aktionspotentialen
heisen die Intervalle auch \enterm{Interspikeintervalle}. Deren Statistik heisen die Intervalle auch \determ{Interspikeintervalle}
kann mit den \"ublichen Gr\"o{\ss}en beschrieben werden. (\enterm{interspike intervals}). Deren Statistik kann mit den
\"ublichen Gr\"o{\ss}en beschrieben werden.
\begin{figure}[t] \begin{figure}[t]
\includegraphics[width=1\textwidth]{isihexamples}\hfill \includegraphics[width=0.96\textwidth]{isihexamples}\vspace{-2ex}
\titlecaption{\label{isihexamplesfig}Interspikeintervall Histogramme}{der in \titlecaption{\label{isihexamplesfig}Interspikeintervall Histogramme}{der in
\figref{rasterexamplesfig} gezeigten Spikes.} \figref{rasterexamplesfig} gezeigten Spikes.}
\end{figure} \end{figure}
@ -104,21 +107,21 @@ kann mit den \"ublichen Gr\"o{\ss}en beschrieben werden.
\frac{1}{n}\sum\limits_{i=1}^n T_i$. \frac{1}{n}\sum\limits_{i=1}^n T_i$.
\item Standardabweichung der Intervalle: $\sigma_{ISI} = \sqrt{\langle (T - \langle T \item Standardabweichung der Intervalle: $\sigma_{ISI} = \sqrt{\langle (T - \langle T
\rangle)^2 \rangle}$\vspace{1ex} \rangle)^2 \rangle}$\vspace{1ex}
\item Variationskoeffizient (\enterm{coefficient of variation}): $CV_{ISI} = \item \determ{Variationskoeffizient} (\enterm{coefficient of variation}): $CV_{ISI} =
\frac{\sigma_{ISI}}{\mu_{ISI}}$. \frac{\sigma_{ISI}}{\mu_{ISI}}$.
\item Diffusions Koeffizient: $D_{ISI} = \item \determ{Diffusionskoeffizient} (\enterm{diffusion coefficient}): $D_{ISI} =
\frac{\sigma_{ISI}^2}{2\mu_{ISI}^3}$. \frac{\sigma_{ISI}^2}{2\mu_{ISI}^3}$.
\end{itemize} \end{itemize}
\begin{exercise}{isi_hist.m}{} \begin{exercise}{isiHist.m}{}
Schreibe eine Funktion \code{isi\_hist()}, die einen Vektor mit Interspikeintervallen Schreibe eine Funktion \code{isiHist()}, die einen Vektor mit Interspikeintervallen
entgegennimmt und daraus ein normiertes Histogramm der Interspikeintervalle entgegennimmt und daraus ein normiertes Histogramm der Interspikeintervalle
berechnet. berechnet.
\end{exercise} \end{exercise}
\begin{exercise}{plot_isi_hist.m}{} \begin{exercise}{plotISIHist.m}{}
Schreibe eine Funktion, die die Histogrammdaten der Funktion Schreibe eine Funktion, die die Histogrammdaten der Funktion
\code{isi\_hist()} entgegennimmt, um das Histogramm zu plotten. Im \code{isiHist()} entgegennimmt, um das Histogramm zu plotten. Im
Plot sollen die Interspikeintervalle in Millisekunden aufgetragen Plot sollen die Interspikeintervalle in Millisekunden aufgetragen
werden. Das Histogramm soll zus\"atzlich mit Mittelwert, werden. Das Histogramm soll zus\"atzlich mit Mittelwert,
Standardabweichung und Variationskoeffizient der Standardabweichung und Variationskoeffizient der
@ -139,9 +142,10 @@ sichtbar.
im Abstand des Lags $k$.} im Abstand des Lags $k$.}
\end{figure} \end{figure}
Solche Ab\"angigkeiten werden durch die serielle Korrelation der Solche Ab\"angigkeiten werden durch die \determ{serielle
Intervalle quantifiziert. Das ist der Korrelationskoeffizient Korrelationen} (\enterm{serial correlations}) der Intervalle
zwischen aufeinander folgenden Intervallen getrennt durch lag $k$: quantifiziert. Das ist der \determ{Korrelationskoeffizient} zwischen
aufeinander folgenden Intervallen getrennt durch lag $k$:
\[ \rho_k = \frac{\langle (T_{i+k} - \langle T \rangle)(T_i - \langle T \rangle) \rangle}{\langle (T_i - \langle T \rangle)^2\rangle} = \frac{{\rm cov}(T_{i+k}, T_i)}{{\rm var}(T_i)} \[ \rho_k = \frac{\langle (T_{i+k} - \langle T \rangle)(T_i - \langle T \rangle) \rangle}{\langle (T_i - \langle T \rangle)^2\rangle} = \frac{{\rm cov}(T_{i+k}, T_i)}{{\rm var}(T_i)}
= {\rm corr}(T_{i+k}, T_i) \] = {\rm corr}(T_{i+k}, T_i) \]
\"Ublicherweise wird die Korrelation $\rho_k$ gegen den Lag $k$ \"Ublicherweise wird die Korrelation $\rho_k$ gegen den Lag $k$
@ -151,6 +155,7 @@ Intervalls mit sich selber).
\begin{exercise}{isiserialcorr.m}{} \begin{exercise}{isiserialcorr.m}{}
Schreibe eine Funktion \code{isiserialcorr()}, die einen Vektor mit Interspikeintervallen Schreibe eine Funktion \code{isiserialcorr()}, die einen Vektor mit Interspikeintervallen
entgegennimmt und daraus die seriellen Korrelationen berechnet und plottet. entgegennimmt und daraus die seriellen Korrelationen berechnet und plottet.
\pagebreak[4]
\end{exercise} \end{exercise}
@ -170,10 +175,10 @@ durch folgende Sch\"atzer charakterisiert werden:
\item Histogramm der counts $n_i$. \item Histogramm der counts $n_i$.
\item Mittlere Anzahl von Ereignissen: $\mu_N = \langle n \rangle$. \item Mittlere Anzahl von Ereignissen: $\mu_N = \langle n \rangle$.
\item Varianz der Anzahl: $\sigma_n^2 = \langle (n - \langle n \rangle)^2 \rangle$. \item Varianz der Anzahl: $\sigma_n^2 = \langle (n - \langle n \rangle)^2 \rangle$.
\item Fano Faktor (Varianz geteilt durch Mittelwert): $F = \frac{\sigma_n^2}{\mu_n}$. \item \determ{Fano Faktor} (Varianz geteilt durch Mittelwert): $F = \frac{\sigma_n^2}{\mu_n}$.
\end{itemize} \end{itemize}
Insbesondere ist die mittlere Rate der Ereignisse $r$ (Spikes pro Insbesondere ist die mittlere Rate der Ereignisse $r$ (Spikes pro
Zeit, \determ{Feuerrate}) gemessen in Hertz Zeit, \determ{Feuerrate}) gemessen in Hertz \sindex[term]{Feuerrate!mittlere Rate}
\begin{equation} \begin{equation}
\label{firingrate} \label{firingrate}
r = \frac{\langle n \rangle}{W} \; . r = \frac{\langle n \rangle}{W} \; .
@ -209,18 +214,18 @@ u.a. wegen dem Zentralen Grenzwertsatz die Standardverteilung. Eine
\"ahnliche Rolle spielt bei Punktprozessen der \determ{Poisson \"ahnliche Rolle spielt bei Punktprozessen der \determ{Poisson
Prozess}. Prozess}.
Beim homogenen Poisson Prozess treten Ereignisse mit einer festen Rate Beim \determ[Poisson Prozess!homogener]{homogenen Poisson Prozess}
$\lambda=\text{const.}$ auf und sind unabh\"angig von der Zeit $t$ und treten Ereignisse mit einer festen Rate $\lambda=\text{const.}$ auf
unabh\"angig von den Zeitpunkten fr\"uherer Ereignisse und sind unabh\"angig von der Zeit $t$ und unabh\"angig von den
(\figref{hompoissonfig}). Die Wahrscheinlichkeit zu irgendeiner Zeit Zeitpunkten fr\"uherer Ereignisse (\figref{hompoissonfig}). Die
ein Ereigniss in einem kleinen Zeitfenster der Breite $\Delta t$ zu Wahrscheinlichkeit zu irgendeiner Zeit ein Ereigniss in einem kleinen
bekommen ist Zeitfenster der Breite $\Delta t$ zu bekommen ist
\begin{equation} \begin{equation}
\label{hompoissonprob} \label{hompoissonprob}
P = \lambda \cdot \Delta t \; . P = \lambda \cdot \Delta t \; .
\end{equation} \end{equation}
Beim inhomogenen Poisson Prozess h\"angt die Rate $\lambda$ von der Beim \determ[Poisson Prozess!inhomogener]{inhomogenen Poisson Prozess}
Zeit ab: $\lambda = \lambda(t)$. h\"angt die Rate $\lambda$ von der Zeit ab: $\lambda = \lambda(t)$.
\begin{exercise}{poissonspikes.m}{} \begin{exercise}{poissonspikes.m}{}
Schreibe eine Funktion \code{poissonspikes()}, die die Spikezeiten Schreibe eine Funktion \code{poissonspikes()}, die die Spikezeiten
@ -253,14 +258,15 @@ Der homogene Poissonprozess hat folgende Eigenschaften:
\item Das mittlere Intervall ist $\mu_{ISI} = \frac{1}{\lambda}$ . \item Das mittlere Intervall ist $\mu_{ISI} = \frac{1}{\lambda}$ .
\item Die Varianz der Intervalle ist $\sigma_{ISI}^2 = \frac{1}{\lambda^2}$ . \item Die Varianz der Intervalle ist $\sigma_{ISI}^2 = \frac{1}{\lambda^2}$ .
\item Der Variationskoeffizient ist also immer $CV_{ISI} = 1$ . \item Der Variationskoeffizient ist also immer $CV_{ISI} = 1$ .
\item Die seriellen Korrelationen $\rho_k =0$ f\"ur $k>0$, da das \item Die \determ[serielle Korrelationen]{seriellen Korrelationen}
Auftreten der Ereignisse unabh\"angig von der Vorgeschichte ist. Ein $\rho_k =0$ f\"ur $k>0$, da das Auftreten der Ereignisse
solcher Prozess wird auch \determ{Erneuerungsprozess} genannt (\enterm{renewal unabh\"angig von der Vorgeschichte ist. Ein solcher Prozess wird
process}). auch \determ{Erneuerungsprozess} genannt (\enterm{renewal process}).
\item Die Anzahl der Ereignisse $k$ innerhalb eines Fensters der L\"ange W ist Poissonverteilt: \item Die Anzahl der Ereignisse $k$ innerhalb eines Fensters der
L\"ange W ist \determ[Poisson-Verteilung]{Poissonverteilt}:
\[ P(k) = \frac{(\lambda W)^ke^{\lambda W}}{k!} \] \[ P(k) = \frac{(\lambda W)^ke^{\lambda W}}{k!} \]
(\figref{hompoissoncountfig}) (\figref{hompoissoncountfig})
\item Der Fano Faktor ist immer $F=1$ . \item Der \determ{Fano Faktor} ist immer $F=1$ .
\end{itemize} \end{itemize}
\begin{exercise}{hompoissonspikes.m}{} \begin{exercise}{hompoissonspikes.m}{}
@ -299,13 +305,11 @@ Abbildung \ref{psthfig} n\"aher erl\"autert.
\begin{figure}[tp] \begin{figure}[tp]
\includegraphics[width=\columnwidth]{firingrates} \includegraphics[width=\columnwidth]{firingrates}
\titlecaption{Verschiedene Methoden die zeitabh\"angige Feuerrate \titlecaption{Bestimmung der zeitabh\"angigen
zu bestimmen.}{\textbf{A)} Rasterplot einer einzelnen neuronalen Feuerrate.}{\textbf{A)} Rasterplot eines Spiketrains. \textbf{B)}
Antwort. Jeder vertikale Strich notiert den Zeitpunkt eines Feurerrate aus der instantanen Feuerrate bestimmt. \textbf{C)}
Aktionspotentials. \textbf{B)} Feurerrate aus der instantanen klassisches PSTH mit der Binning Methode. \textbf{D)} Feuerrate
Feuerrate bestimmt. \textbf{C)} klassisches PSTH mit der Binning durch Faltung mit einem Gauss Kern bestimmt.}\label{psthfig}
Methode. \textbf{D)} Feuerrate durch Faltung mit einem Gauss Kern
bestimmt.}\label{psthfig}
\end{figure} \end{figure}
@ -314,26 +318,27 @@ Abbildung \ref{psthfig} n\"aher erl\"autert.
\begin{figure}[tp] \begin{figure}[tp]
\includegraphics[width=\columnwidth]{isimethod} \includegraphics[width=\columnwidth]{isimethod}
\titlecaption{Instantane Feuerrate.}{Skizze eines Spiketrains \titlecaption{Instantane Feuerrate.}{Skizze eines Spiketrains
(oben). Jeder vertikale Strich notiert den Zeitpunkt eines (oben). Die Pfeile zwischen aufeinanderfolgenden
Aktionspotentials. Die Pfeile zwischen aufeinanderfolgenden
Aktionspotentialen mit den Zahlen in Millisekunden illustrieren Aktionspotentialen mit den Zahlen in Millisekunden illustrieren
die Interspikeintervalle. Der Kehrwert des Interspikeintervalle die Interspikeintervalle. Der Kehrwert des Interspikeintervalle
ergibt die instantane Feuerrate.}\label{instrate} ergibt die instantane Feuerrate.}\label{instrate}
\end{figure} \end{figure}
Ein sehr einfacher Weg, die zeitabh\"angige Feuerrate zu bestimmen ist Ein sehr einfacher Weg, die zeitabh\"angige Feuerrate zu bestimmen ist
die sogenannte \determ{instantane Feuerrate}. Dabei wird die Feuerrate die sogenannte \determ[Feuerrate!instantane]{instantane Feuerrate}
aus dem Kehrwert der Interspikeintervalle, der Zeit zwischen zwei (\enterm[firing rate!instantaneous]{instantaneous firing rate}). Dabei
aufeinander folgenden Aktionspotentialen (\figref{instrate} A), wird die Feuerrate aus dem Kehrwert der Interspikeintervalle, der Zeit
bestimmt. Die abgesch\"atzte Feuerrate (\figref{instrate} B) ist zwischen zwei aufeinander folgenden Aktionspotentialen
g\"ultig f\"ur das gesammte Interspikeintervall. Diese Methode hat den (\figref{instrate} A), bestimmt. Die abgesch\"atzte Feuerrate
Vorteil, dass sie sehr einfach zu berechnen ist und keine Annahme (\figref{instrate} B) ist g\"ultig f\"ur das gesammte
\"uber eine relevante Zeitskala (der Kodierung oder des Interspikeintervall. Diese Methode hat den Vorteil, dass sie sehr
Auslesemechanismus der postsynaptischen Zelle) macht. $r(t)$ ist einfach zu berechnen ist und keine Annahme \"uber eine relevante
allerdings keine kontinuierliche Funktion, die Spr\"unge in der Zeitskala (der Kodierung oder des Auslesemechanismus der
Feuerrate k\"onnen f\"ur manche Analysen nachteilig sein. Au{\ss}erdem postsynaptischen Zelle) macht. $r(t)$ ist allerdings keine
wird die Feuerrate nie gleich Null, auch wenn lange keine Aktionspotentiale kontinuierliche Funktion, die Spr\"unge in der Feuerrate k\"onnen
generiert wurden. f\"ur manche Analysen nachteilig sein. Au{\ss}erdem wird die Feuerrate
nie gleich Null, auch wenn lange keine Aktionspotentiale generiert
wurden.
\begin{exercise}{instantaneousRate.m}{} \begin{exercise}{instantaneousRate.m}{}
Implementiere die Absch\"atzung der Feuerrate auf Basis der Implementiere die Absch\"atzung der Feuerrate auf Basis der
@ -345,9 +350,10 @@ generiert wurden.
W\"ahrend die Instantane Rate den Kehrwert der Zeit von einem bis zum W\"ahrend die Instantane Rate den Kehrwert der Zeit von einem bis zum
n\"achsten Aktionspotential misst, sch\"atzt das sogenannte n\"achsten Aktionspotential misst, sch\"atzt das sogenannte
\determ{Peri-Stimulus-Zeit-Histogramm} (\enterm{peri stimulus time \determ{Peri-Stimulus-Zeit-Histogramm} (\enterm{peri stimulus time
histogram}, PSTH) die Wahrscheinlichkeit ab, zu einem Zeitpunkt histogram}, \determ[PSTH|see{Peri-Stimulus-Zeit-Histogramm}]{PSTH})
Aktionspotentiale anzutreffen. Es wird versucht die mittlere Rate \eqnref{firingrate} die Wahrscheinlichkeit ab, zu einem Zeitpunkt Aktionspotentiale
im Grenzwert kleiner Beobachtungszeiten abzusch\"atzen: anzutreffen. Es wird versucht die mittlere Rate \eqnref{firingrate} im
Grenzwert kleiner Beobachtungszeiten abzusch\"atzen:
\begin{equation} \begin{equation}
\label{psthrate} \label{psthrate}
r(t) = \lim_{W \to 0} \frac{\langle n \rangle}{W} \; , r(t) = \lim_{W \to 0} \frac{\langle n \rangle}{W} \; ,
@ -377,9 +383,9 @@ Bei der Binning-Methode wird die Zeitachse in gleichm\"aßige
Abschnitte (Bins) eingeteilt und die Anzahl Aktionspotentiale, die in Abschnitte (Bins) eingeteilt und die Anzahl Aktionspotentiale, die in
die jeweiligen Bins fallen, gez\"ahlt (\figref{binpsth} A). Um diese die jeweiligen Bins fallen, gez\"ahlt (\figref{binpsth} A). Um diese
Z\"ahlungen in die Feuerrate umzurechnen muss noch mit der Binweite Z\"ahlungen in die Feuerrate umzurechnen muss noch mit der Binweite
normiert werden. Das ist fast so, wie beim Absch\"atzen einer normiert werden. Das ist \"aquivalent zur Absch\"atzung einer
Wahrscheinlichkeitsdichte. Es kann auch die \code{hist} Funktion zur Wahrscheinlichkeitsdichte. Es kann auch die \code{hist()} Funktion zur
Bestimmung des PSTHs verwendet werden. Bestimmung des PSTHs verwendet werden. \sindex[term]{Feuerrate!Binningmethode}
Die bestimmte Feuerrate gilt f\"ur das gesamte Bin (\figref{binpsth} Die bestimmte Feuerrate gilt f\"ur das gesamte Bin (\figref{binpsth}
B). Das so berechnete PSTH hat wiederum eine stufige Form, die von der B). Das so berechnete PSTH hat wiederum eine stufige Form, die von der
@ -390,6 +396,7 @@ vorkommen k\"onnen nicht aufgl\"ost werden. Mit der Wahl der Binweite
wird somit eine Annahme \"uber die relevante Zeitskala des Spiketrains wird somit eine Annahme \"uber die relevante Zeitskala des Spiketrains
gemacht. gemacht.
\pagebreak[4]
\begin{exercise}{binnedRate.m}{} \begin{exercise}{binnedRate.m}{}
Implementiere die Absch\"atzung der Feuerrate mit der ``binning'' Implementiere die Absch\"atzung der Feuerrate mit der ``binning''
Methode. Plotte das PSTH. Methode. Plotte das PSTH.
@ -421,7 +428,7 @@ wobei $\omega(\tau)$ der Filterkern und $\rho(t)$ die bin\"are Antwort
ist. Bildlich geprochen wird jede 1 in $\rho(t)$ durch den Filterkern ist. Bildlich geprochen wird jede 1 in $\rho(t)$ durch den Filterkern
ersetzt (Abbildung \ref{convrate} A). Wenn der Kern richtig normiert ersetzt (Abbildung \ref{convrate} A). Wenn der Kern richtig normiert
wurde (Integral gleich Eins), ergibt sich die Feuerrate direkt aus der wurde (Integral gleich Eins), ergibt sich die Feuerrate direkt aus der
\"Uberlagerung der Kerne (Abb. \ref{convrate} B). \"Uberlagerung der Kerne (Abb. \ref{convrate} B). \sindex[term]{Feuerrate!Faltungsmethode}
Die Faltungsmethode f\"uhrt, anders als die anderen Methoden, zu einer Die Faltungsmethode f\"uhrt, anders als die anderen Methoden, zu einer
stetigen Funktion was insbesondere f\"ur spektrale Analysen von stetigen Funktion was insbesondere f\"ur spektrale Analysen von
@ -430,6 +437,7 @@ Binweite, die zeitliche Aufl\"osung von $r(t)$. Die Breite des Kerns
macht also auch wieder eine Annahme \"uber die relevante Zeitskala des macht also auch wieder eine Annahme \"uber die relevante Zeitskala des
Spiketrains. Spiketrains.
\pagebreak[4]
\begin{exercise}{convolutionRate.m}{} \begin{exercise}{convolutionRate.m}{}
Verwende die Faltungsmethode um die Feuerrate zu bestimmen. Plotte Verwende die Faltungsmethode um die Feuerrate zu bestimmen. Plotte
das Ergebnis. das Ergebnis.
@ -438,8 +446,9 @@ Spiketrains.
\section{Spike-triggered Average} \section{Spike-triggered Average}
Die graphischer Darstellung der Feuerrate allein reicht nicht aus um Die graphischer Darstellung der Feuerrate allein reicht nicht aus um
den Zusammenhang zwischen neuronaler Antwort und einem Stimulus zu den Zusammenhang zwischen neuronaler Antwort und einem Stimulus zu
analysieren. Eine Methode um mehr \"uber diesen Zusammenhang zu erfahren, analysieren. Eine Methode um mehr \"uber diesen Zusammenhang zu
ist der \enterm{Spike-triggered average} (STA). Der STA erfahren, ist der \enterm{spike-triggered average}
(\enterm[STA|see{spike-triggered average}]{STA}). Der STA
\begin{equation} \begin{equation}
STA(\tau) = \langle s(t - \tau) \rangle = \frac{1}{N} \sum_{i=1}^{N} s(t_i - \tau) STA(\tau) = \langle s(t - \tau) \rangle = \frac{1}{N} \sum_{i=1}^{N} s(t_i - \tau)
\end{equation} \end{equation}
@ -477,17 +486,20 @@ antworten.
Der STA kann auch dazu benutzt werden, aus den Antworten der Zelle den Der STA kann auch dazu benutzt werden, aus den Antworten der Zelle den
Stimulus zu rekonstruieren (\figref{stafig} B). Bei der Stimulus zu rekonstruieren (\figref{stafig} B). Bei der
\determ{invertierten Rekonstruktion} wird die Zellantwort mit dem STA \determ[invertierte Rekonstruktion]{invertierten Rekonstruktion} wird
verfaltet. die Zellantwort mit dem STA verfaltet.
\begin{exercise}{spikeTriggeredAverage.m}{} \begin{exercise}{spikeTriggeredAverage.m}{}
Implementiere eine Funktion, die den STA ermittelt. Verwende dazu Implementiere eine Funktion, die den STA ermittelt. Verwende dazu
den Datensatz \codeterm{sta\_data.mat}. Die Funktion sollte folgende den Datensatz \file{sta\_data.mat}. Die Funktion sollte folgende
R\"uckgabewerte haben: R\"uckgabewerte haben:
\vspace{-1ex}
\begin{itemize} \begin{itemize}
\setlength{\itemsep}{0ex}
\item den Spike-Triggered-Average. \item den Spike-Triggered-Average.
\item die Standardabweichung der individuellen STAs. \item die Standardabweichung der individuellen STAs.
\item die Anzahl Aktionspotentiale, die dem STA zugrunde liegen. \item die Anzahl Aktionspotentiale, die zur Berechnung des STA verwendet wurden.
\vspace{-2ex}
\end{itemize} \end{itemize}
\end{exercise} \end{exercise}
@ -495,7 +507,5 @@ verfaltet.
Rekonstruiere den Stimulus mithilfe des STA und der Spike Rekonstruiere den Stimulus mithilfe des STA und der Spike
Zeiten. Die Funktion soll Vektor als R\"uckgabewert haben, der Zeiten. Die Funktion soll Vektor als R\"uckgabewert haben, der
genauso gro{\ss} ist wie der Originalstimulus aus der Datei genauso gro{\ss} ist wie der Originalstimulus aus der Datei
\codeterm{sta\_data.mat}. \file{sta\_data.mat}.
\end{exercise} \end{exercise}

View File

@ -1,4 +1,4 @@
set term epslatex size 11.4cm, 7cm set term epslatex size 11.4cm, 6.5cm
set out 'pointprocessscetch.tex' set out 'pointprocessscetch.tex'
set border 0 set border 0

View File

@ -1,7 +1,7 @@
%!PS-Adobe-2.0 EPSF-2.0 %!PS-Adobe-2.0 EPSF-2.0
%%Title: pointprocessscetchA.tex %%Title: pointprocessscetchA.tex
%%Creator: gnuplot 4.6 patchlevel 4 %%Creator: gnuplot 4.6 patchlevel 4
%%CreationDate: Tue Nov 3 17:29:16 2015 %%CreationDate: Sat Nov 28 12:01:31 2015
%%DocumentFonts: %%DocumentFonts:
%%BoundingBox: 50 50 373 135 %%BoundingBox: 50 50 373 135
%%EndComments %%EndComments
@ -430,10 +430,10 @@ SDict begin [
/Title (pointprocessscetchA.tex) /Title (pointprocessscetchA.tex)
/Subject (gnuplot plot) /Subject (gnuplot plot)
/Creator (gnuplot 4.6 patchlevel 4) /Creator (gnuplot 4.6 patchlevel 4)
/Author (grewe) /Author (jan)
% /Producer (gnuplot) % /Producer (gnuplot)
% /Keywords () % /Keywords ()
/CreationDate (Tue Nov 3 17:29:16 2015) /CreationDate (Sat Nov 28 12:01:31 2015)
/DOCINFO pdfmark /DOCINFO pdfmark
end end
} ifelse } ifelse

View File

@ -1,7 +1,7 @@
%!PS-Adobe-2.0 EPSF-2.0 %!PS-Adobe-2.0 EPSF-2.0
%%Title: pointprocessscetchB.tex %%Title: pointprocessscetchB.tex
%%Creator: gnuplot 4.6 patchlevel 4 %%Creator: gnuplot 4.6 patchlevel 4
%%CreationDate: Tue Nov 3 18:24:39 2015 %%CreationDate: Sat Nov 28 12:01:32 2015
%%DocumentFonts: %%DocumentFonts:
%%BoundingBox: 50 50 373 237 %%BoundingBox: 50 50 373 237
%%EndComments %%EndComments
@ -430,10 +430,10 @@ SDict begin [
/Title (pointprocessscetchB.tex) /Title (pointprocessscetchB.tex)
/Subject (gnuplot plot) /Subject (gnuplot plot)
/Creator (gnuplot 4.6 patchlevel 4) /Creator (gnuplot 4.6 patchlevel 4)
/Author (grewe) /Author (jan)
% /Producer (gnuplot) % /Producer (gnuplot)
% /Keywords () % /Keywords ()
/CreationDate (Tue Nov 3 18:24:39 2015) /CreationDate (Sat Nov 28 12:01:32 2015)
/DOCINFO pdfmark /DOCINFO pdfmark
end end
} ifelse } ifelse

View File

@ -83,4 +83,4 @@ ax.eventplot(inhspikes, colors=[[0, 0, 0]], linelength=0.8)
plt.tight_layout() plt.tight_layout()
plt.savefig('rasterexamples.pdf') plt.savefig('rasterexamples.pdf')
plt.show() plt.close()

View File

@ -38,18 +38,22 @@ def reconstruct_stimulus(spike_times, sta, stimulus, t_max=30., dt=1e-4):
def plot_results(sta_time, st_average, stim_time, s_est, stimulus, duration, dt): def plot_results(sta_time, st_average, stim_time, s_est, stimulus, duration, dt):
plt.xkcd()
sta_ax = plt.subplot2grid((1, 3), (0, 0), rowspan=1, colspan=1) sta_ax = plt.subplot2grid((1, 3), (0, 0), rowspan=1, colspan=1)
stim_ax = plt.subplot2grid((1, 3), (0, 1), rowspan=1, colspan=2) stim_ax = plt.subplot2grid((1, 3), (0, 1), rowspan=1, colspan=2)
fig = plt.gcf() fig = plt.gcf()
fig.set_size_inches(15, 5) fig.set_size_inches(8, 3)
fig.subplots_adjust(left=0.075, bottom=0.12, top=0.92, right=0.975) fig.subplots_adjust(left=0.08, bottom=0.15, top=0.9, right=0.975)
fig.set_facecolor("white") fig.set_facecolor("white")
sta_ax.plot(sta_time * 1000, st_average, color="dodgerblue", lw=2.) sta_ax.plot(sta_time * 1000, st_average, color="#FF9900", lw=2.)
sta_ax.set_xlabel("time [ms]", fontsize=12) sta_ax.set_xlabel("Time (ms)")
sta_ax.set_ylabel("stimulus", fontsize=12) sta_ax.set_ylabel("Stimulus")
sta_ax.set_xlim([-50, 50]) sta_ax.set_xlim(-40, 20)
sta_ax.set_xticks(np.arange(-40, 21, 20))
sta_ax.set_ylim(-0.1, 0.2)
sta_ax.set_yticks(np.arange(-0.1, 0.21, 0.1))
# sta_ax.xaxis.grid('off') # sta_ax.xaxis.grid('off')
sta_ax.spines["right"].set_visible(False) sta_ax.spines["right"].set_visible(False)
sta_ax.spines["top"].set_visible(False) sta_ax.spines["top"].set_visible(False)
@ -58,22 +62,31 @@ def plot_results(sta_time, st_average, stim_time, s_est, stimulus, duration, dt)
sta_ax.spines["bottom"].set_linewidth(2.0) sta_ax.spines["bottom"].set_linewidth(2.0)
sta_ax.spines["left"].set_linewidth(2.0) sta_ax.spines["left"].set_linewidth(2.0)
sta_ax.tick_params(direction="out", width=2.0) sta_ax.tick_params(direction="out", width=2.0)
ylim = sta_ax.get_ylim() ylim = sta_ax.get_ylim()
xlim = sta_ax.get_xlim() xlim = sta_ax.get_xlim()
sta_ax.plot(list(xlim), [0., 0.], zorder=1, color='darkgray', ls='--', lw=0.75) sta_ax.plot(list(xlim), [0., 0.], zorder=1, color='darkgray', ls='--', lw=1)
sta_ax.plot([0., 0.], list(ylim), zorder=1, color='darkgray', ls='--', lw=0.75) sta_ax.plot([0., 0.], list(ylim), zorder=1, color='darkgray', ls='--', lw=1)
sta_ax.set_xlim(list(xlim)) sta_ax.set_xlim(list(xlim))
sta_ax.set_ylim(list(ylim)) sta_ax.set_ylim(list(ylim))
sta_ax.text(-0.225, 1.05, "A", transform=sta_ax.transAxes, size=14) sta_ax.annotate('Time of\nspike',
xy=(0, 0.18), xycoords='data',
xytext=(-35, 0.19), textcoords='data', ha='left',
arrowprops=dict(arrowstyle="->", relpos=(1.0,0.5),
connectionstyle="angle3,angleA=0,angleB=-70") )
sta_ax.annotate('STA',
xy=(-10, 0.05), xycoords='data',
xytext=(-33, 0.09), textcoords='data', ha='left',
arrowprops=dict(arrowstyle="->", relpos=(1.0,0.0),
connectionstyle="angle3,angleA=60,angleB=-40") )
#sta_ax.text(-0.25, 1.04, "A", transform=sta_ax.transAxes, size=24)
stim_ax.plot(stim_time * 1000, stimulus[:,1], label='stimulus', color='dodgerblue', lw=2.) stim_ax.plot(stim_time * 1000, stimulus[:,1], label='stimulus', color='#0000FF', lw=2.)
stim_ax.plot(stim_time * 1000, s_est, label='reconstruction', color='red', lw=2) stim_ax.plot(stim_time * 1000, s_est, label='reconstruction', color='#FF9900', lw=2)
stim_ax.set_xlabel('time[ms]', fontsize=12) stim_ax.set_xlabel('Time (ms)')
stim_ax.set_xlim([0.0, 250]) stim_ax.set_xlim(0.0, 200)
stim_ax.set_ylim([-1., 1.]) stim_ax.set_ylim([-1., 1.])
stim_ax.legend() stim_ax.legend(loc=(0.3, 0.85), frameon=False, fontsize=12)
stim_ax.plot([0.0, 250], [0., 0.], color="darkgray", lw=0.75, ls='--', zorder=1) stim_ax.plot([0.0, 250], [0., 0.], color="darkgray", lw=1, ls='--', zorder=1)
stim_ax.spines["right"].set_visible(False) stim_ax.spines["right"].set_visible(False)
stim_ax.spines["top"].set_visible(False) stim_ax.spines["top"].set_visible(False)
stim_ax.yaxis.set_ticks_position('left') stim_ax.yaxis.set_ticks_position('left')
@ -81,8 +94,9 @@ def plot_results(sta_time, st_average, stim_time, s_est, stimulus, duration, dt)
stim_ax.spines["bottom"].set_linewidth(2.0) stim_ax.spines["bottom"].set_linewidth(2.0)
stim_ax.spines["left"].set_linewidth(2.0) stim_ax.spines["left"].set_linewidth(2.0)
stim_ax.tick_params(direction="out", width=2.0) stim_ax.tick_params(direction="out", width=2.0)
stim_ax.text(-0.075, 1.05, "B", transform=stim_ax.transAxes, size=14) #stim_ax.text(-0.1, 1.04, "B", transform=stim_ax.transAxes, size=24)
fig.tight_layout()
fig.savefig("sta.pdf") fig.savefig("sta.pdf")
plt.close() plt.close()

View File

@ -3,5 +3,6 @@ counter = 1;
x = 1; x = 1;
while counter <= n while counter <= n
x = x * counter; x = x * counter;
counter = counter + 1
end end
fprintf('Faculty of %i is: %i\n', n, x) fprintf('Faculty of %i is: %i\n', n, x)

View File

@ -3,14 +3,12 @@ if x < 0.5
disp('x is less than 0.5'); disp('x is less than 0.5');
end end
if x < 0.5 if x < 0.5
disp('x is less than 0.5!'); disp('x is less than 0.5!');
else else
disp('x is greater than or equal to 0.5!') disp('x is greater than or equal to 0.5!')
end end
if x < 0.5 if x < 0.5
disp('x is less than 0.5!'); disp('x is less than 0.5!');
elseif x < 0.75 elseif x < 0.75

View File

@ -1,12 +1,12 @@
t = 0:0.001:10; t = 0:0.001:10;
x = randn(size(t)); x = randn(size(t));
selection = x (t > 5 & t < 6); selection = x(t > 5 & t < 6);
figure() figure()
hold on hold on
plot(t, x, 'displayname', 'measurements') plot(t, x, 'displayname', 'measurements')
plot(t(t > 5 & t < 6), selection, 'displayname', 'selection') plot(t(t > 5 & t < 6), selection, 'displayname', 'selection')
xlabel('time [s]') xlabel('Time [s]')
ylabel('intensity') ylabel('Intensity')
legend 'show' legend 'show'
box 'off' box 'off'

View File

@ -1,12 +1,10 @@
>> logicalVector >> logicalVector
Logischer Vektor y: Logischer Vektor y:
y = y =
1 1 1 1 0 0 0 0 0 0 1 1 1 1 0 0 0 0 0 0
Datentyp von y: logical Datentyp von y: logical
Alle Elemente aus x, die kleiner als 5 sind: Alle Elemente aus x, die kleiner als 5 sind:
ans = ans =
1 2 3 4 1 2 3 4

View File

@ -1,14 +1,3 @@
a = (11:20); % a vector with 10 Elements s = size(a) % Speicher den Rueckgabewert von size() in einer Variablen
fprintf('length of a: %i\n', length(a)) s(2) % Inhalt der zweiten Zahl, d.h. Laenge der 2. Dimension
size_of_a = size(a); % get the size and store it in a new variable size(a,2) % Die kurze Alternative
% size_of_a is a vector itself
fprintf('number of dimensions (rank) of size_of_a: %i\n', length(size_of_a))
% get the value of the second element of size_of_a
fprintf('number of entries in the 2nd dimesion of a: %i\n', size_of_a(2))
%% Uebersichtliche Alternative?
s = size(a); % Speicher den Rueckgabewert von size() in einer Variablen
s(2) % Inhalt der zweiten Zahl, d.h. Laenge der 2. Dimension
size(a,2) % Kurze Alternative

View File

@ -1,4 +1,3 @@
>> vectorsize s = 1 10
length of a: 10 ans = 10
number of dimensions (rank) of size_of_a: 2 ans = 10
number of entries in the 2nd dimesion of a: 10

View File

@ -2,33 +2,13 @@ BASENAME=programming
#TEXFILES=boolean_logical_indexing.tex control_structures.tex data_structures.tex plotting.tex programming_basics.tex scripts_functions.tex sta_stc.tex variables_datatypes.tex vectors_matrices.tex #TEXFILES=boolean_logical_indexing.tex control_structures.tex data_structures.tex plotting.tex programming_basics.tex scripts_functions.tex sta_stc.tex variables_datatypes.tex vectors_matrices.tex
PYFILES=$(wildcard *.py)
PYPDFFILES=$(PYFILES:.py=.pdf)
all : pdf all : pdf
# script: include ../../chapter.mk
pdf : $(BASENAME)-chapter.pdf
$(BASENAME)-chapter.pdf : $(BASENAME)-chapter.tex $(BASENAME).tex $(PYPDFFILES) ../../header.tex
CHAPTER=$$(( $$(sed -n -e '/contentsline {chapter}/{s/.*numberline {\([0123456789]*\)}.*/\1/; p}' $(BASENAME).aux) - 1 )); \
PAGE=$$(sed -n -e '/contentsline {chapter}/{s/.*numberline {.*}.*}{\(.*\)}{chapter.*/\1/; p}' $(BASENAME).aux); \
sed -i -e "s/setcounter{page}{.*}/setcounter{page}{$$PAGE}/; s/setcounter{chapter}{.*}/setcounter{chapter}{$$CHAPTER}/" $(BASENAME)-chapter.tex
pdflatex -interaction=scrollmode $< | tee /dev/stderr | fgrep -q "Rerun to get cross-references right" && pdflatex -interaction=scrollmode $< || true
$(PYPDFFILES) : %.pdf : %.py
python $<
clean : # script:
rm -f *~ pdf : chapter
rm -f $(BASENAME).aux $(BASENAME).log
rm -f $(BASENAME)-chapter.aux $(BASENAME)-chapter.log $(BASENAME)-chapter.out
rm -f $(PYPDFFILES) $(GPTTEXFILES)
cleanall : clean
rm -f $(BASENAME)-chapter.pdf
watchpdf :
while true; do ! make -q pdf && make pdf; sleep 0.5; done
clean : cleanchapter
cleanall : clean cleanchapter

View File

@ -5,8 +5,10 @@
\lstset{inputpath=../code} \lstset{inputpath=../code}
\graphicspath{{images/}} \graphicspath{{images/}}
\setcounter{page}{15} \typein[\pagenumber]{Number of first page}
\setcounter{chapter}{0} \typein[\chapternumber]{Chapter number}
\setcounter{page}{\pagenumber}
\setcounter{chapter}{\chapternumber}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -14,5 +16,21 @@
\input{programming} \input{programming}
\section{TODO}
\begin{itemize}
\item Ausgabeformat: \varcode{format} ?
\item Boolescher Ausdruck: ist doch eigentlich boolescher Ausdruck!
\item Expliziter die \varcode{(a:b:c)} Notation einf\"uhren!
\item Mathematische Funktionen sin(), cos(), exp()
\item Rundungsfunktionen round(), floor(), ceil()
\item Zeitvektoren, deltat, Umrechnung Zeit und Index.
\item Matrizen erstmal 2-D und nur kurz n-D
\item Zusammenfassung von Fehlermeldungen bezueglich Matrizen und Vektoren
\item Random-walk behutsam mit einer Schleife, dann zwei Schleifen. Plus Bildchen.
\item Doppelte for-Schleife
\item File output and input (load, save, fprintf, scanf) (extra chapter?)
\item help() und doc()
\end{itemize}
\end{document} \end{document}

File diff suppressed because it is too large Load Diff

View File

@ -1,32 +1,12 @@
BASENAME=programmingstyle BASENAME=programmingstyle
PYFILES=$(wildcard *.py)
PYPDFFILES=$(PYFILES:.py=.pdf)
all : pdf all : pdf
# script: include ../../chapter.mk
pdf : $(BASENAME)-chapter.pdf
$(BASENAME)-chapter.pdf : $(BASENAME)-chapter.tex $(BASENAME).tex $(PYPDFFILES) ../../header.tex
CHAPTER=$$(( $$(sed -n -e '/contentsline {chapter}/{s/.*numberline {\([0123456789]*\)}.*/\1/; p}' $(BASENAME).aux) - 1 )); \
PAGE=$$(sed -n -e '/contentsline {chapter}/{s/.*numberline {.*}.*}{\(.*\)}{chapter.*/\1/; p}' $(BASENAME).aux); \
sed -i -e "s/setcounter{page}{.*}/setcounter{page}{$$PAGE}/; s/setcounter{chapter}{.*}/setcounter{chapter}{$$CHAPTER}/" $(BASENAME)-chapter.tex
pdflatex -interaction=scrollmode $< | tee /dev/stderr | fgrep -q "Rerun to get cross-references right" && pdflatex -interaction=scrollmode $< || true
$(PYPDFFILES) : %.pdf : %.py
python $<
clean : # script:
rm -f *~ pdf : chapter
rm -f $(BASENAME).aux $(BASENAME).log
rm -f $(BASENAME)-chapter.aux $(BASENAME)-chapter.log $(BASENAME)-chapter.out
rm -f $(PYPDFFILES) $(GPTTEXFILES)
cleanall : clean
rm -f $(BASENAME)-chapter.pdf
watchpdf :
while true; do ! make -q pdf && make pdf; sleep 0.5; done
clean : cleanchapter
cleanall : clean cleanchapter

View File

@ -5,8 +5,10 @@
\lstset{inputpath=../code} \lstset{inputpath=../code}
\graphicspath{{figures/}} \graphicspath{{figures/}}
\setcounter{page}{57} \typein[\pagenumber]{Number of first page}
\setcounter{chapter}{2} \typein[\chapternumber]{Chapter number}
\setcounter{page}{\pagenumber}
\setcounter{chapter}{\chapternumber}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

View File

@ -1,19 +1,25 @@
\chapter{\tr{Programming style}{Programmierstil}} \chapter{\tr{Programming style}{Programmierstil}}
\shortquote{Any code of your own that you haven't looked at for six or
more months might as well have been written by someone
else.}{Eagleson's law}
Guter Programmierstil ist keine Frage des guten Geschmacks sondern des Guter Programmierstil ist keine Frage des guten Geschmacks sondern des
Verst\"andnisses von Programmcode und ein Baustein in dem Bestreben Verst\"andnisses von Programmcode und ein Baustein in dem Bestreben
wissenschaftlichen Erkenntnisgewinn reproduzierbar zu wissenschaftlichen Erkenntnisgewinn reproduzierbar zu
machen. machen.
Programme sollten so geschrieben und strukturiert sein, dass es sowohl Programme sollten so geschrieben und strukturiert sein, dass es sowohl
einem Au{\ss}enstehenden als auch einem selbst, nach ein paar Monaten, einem Au{\ss}enstehenden als auch einem selbst --- nach ein paar
leicht f\"allt den Programmablauf nachzuvollziehen und zu Wochen oder Monaten! --- leicht f\"allt den Programmablauf
verstehen. Saubere Programmierung zahlt sich aber in erster Linie nachzuvollziehen und zu verstehen. Saubere Programmierung zahlt sich
f\"ur den Verfasser eines Programmes aus. in erster Linie f\"ur einen selbst aus und macht es aber gleichzeitig
f\"ur andere Personen leichter, den Code nachzuvollziehen und zu
benutzen.
Guter Programmierstil greift auf unterschiedlichen Ebenen an: Guter Programmierstil greift auf unterschiedlichen Ebenen an:
\begin{enumerate} \begin{enumerate}
\item Die Struktur von Programmen. \item Die Dateistruktur von Programmen.
\item Die Namensgebung von Skripten und Funktionen. \item Die Namensgebung von Skripten und Funktionen.
\item Die Namensgebung f\"ur Variablen und Konstanten. \item Die Namensgebung f\"ur Variablen und Konstanten.
\item Die Verwendung von Einr\"uckungen und Leerzeilen um Bl\"ocke im \item Die Verwendung von Einr\"uckungen und Leerzeilen um Bl\"ocke im
@ -82,46 +88,45 @@ aktuellen Ordner nach passenden Dateien sucht (mehr Information zum
(siehe Abbildung). Der \codeterm{Suchpfad} ist eine Liste von (siehe Abbildung). Der \codeterm{Suchpfad} ist eine Liste von
Ordnern in denen \matlab{} nach Funktionen und Skripten suchen Ordnern in denen \matlab{} nach Funktionen und Skripten suchen
soll. Die Suche nach der aufgerufenen Funktion wird dabei von oben soll. Die Suche nach der aufgerufenen Funktion wird dabei von oben
nach unten durchgef\"uhrt. Das heisst, dass es, bei nach unten durchgef\"uhrt. Das heisst, dass es bei
Namensgleichheit, eine Rolle spielen kann an welcher Stelle im Namensgleichheit eine Rolle spielen kann an welcher Stelle im
Suchpfad der erste Treffer gefunden wird. Wichtig: \matlab{} sucht Suchpfad der erste Treffer gefunden wird. Wichtig: \matlab{} sucht
nicht rekursiv! Wenn die gew\"unschte Funktion in einem Unterordner nicht rekursiv! Wenn die gew\"unschte Funktion in einem Unterordner
des aktuellen Arbeitsverzeichnisses liegt, dieses aber nicht des aktuellen Arbeitsverzeichnisses liegt, dieses aber nicht
explizit im Suchpfad enthalten ist, so wird die Funktion nicht explizit im Suchpfad enthalten ist, so wird die Funktion nicht
gefunden werden. gefunden.
\vspace{2ex} \vspace{2ex}
\includegraphics[width=0.75\textwidth]{search_path} \includegraphics[width=0.9\textwidth]{search_path}
\vspace{1.5ex} \vspace{1.5ex}
Der Suchpfad kann sowohl \"uber die in der Abbildung gezeigte GUI Der Suchpfad kann sowohl \"uber die Kommandozeile mit dem Kommandos
oder auch \"uber die Kommandozeile eingestellt werden. Die GUI \code{addpath()} und \code{userpath()} als auch\"uber die in der
erlaubt Ordner aus dem Suchpfad zu entfernen, neue Abbildung gezeigte GUI angezeigt und eingestellt werden. Die GUI
Ordner (optional inklusive aller Unterordner) hinzuzuf\"ugen oder erlaubt Ordner aus dem Suchpfad zu entfernen, neue Ordner (optional
die Reihenfolge der Pfade zu ver\"andern. inklusive aller Unterordner) hinzuzuf\"ugen oder die Reihenfolge der
Pfade zu ver\"andern.
Zum Wechseln des aktuelle Arbeitsverzeichnis wechseln wird das
Kommando \code{cd} verwendet. \code{which} zeigt an, in welchem Pfad Zum Wechseln des aktuellen Arbeitsverzeichnisses wird das Kommando
eine bestimmte Funktion gefunden wurde. Das aktuelle \code{cd} verwendet. \code{which} zeigt an, in welchem Pfad eine
Areitsverzeichnis wird durch den Aufruf \code{pwd} auf der bestimmte Funktion gefunden wurde. Das aktuelle Areitsverzeichnis
Kommandozeile ausgegeben. wird durch den Aufruf \code{pwd} auf der Kommandozeile ausgegeben.
\end{ibox} \end{ibox}
\section{Namensgebung von Funktionen und Skripten} \section{Namensgebung von Funktionen und Skripten}
\matlab{} sucht Funktionen und Skripte ausschlie{\ss}lich anhand des \matlab{} sucht Funktionen und Skripte ausschlie{\ss}lich anhand des
Namens. Dabei spielt die Gro{\ss}- und Kleinschreibung eine Rolle. Das Namens. Dabei spielt die Gro{\ss}- und Kleinschreibung eine Rolle. Die
hei{\ss}t, dass die beiden Dateien \file{test\_funktion.m} und beiden Dateien \file{test\_funktion.m} und \file{Test\_Funktion.m}
\file{Test\_funktion.m} zwei unterschiedliche Funktionen benennen zwei unterschiedliche Funktionen benennen k\"onnen. Diese Art der
k\"onnen. Diese Art der Variation des Namens ist nat\"urlich nicht Variation des Namens ist nat\"urlich nicht sinnvoll. Sie tr\"agt keine
sinnvoll. Sie tr\"agt keine Information \"uber den Unterschied der Information \"uber den Unterschied der beiden Funktionen. Auch sagt
beiden Funktionen. Auch sagt der Name nahezu nichts \"uber den Zweck der Name nahezu nichts \"uber den Zweck der Funktion aus.
der Funktion aus.
Die Namensgebung f\"allt mitunter nicht leicht --- manchmal ist es Die Namensgebung f\"allt mitunter nicht leicht --- manchmal ist es
sogar der schwierigste Aspekt des Programmierens! Ausdrucksstarke sogar der schwierigste Aspekt des Programmierens! Ausdrucksstarke
Namen zu finden lohnt sich aber. Ausdrucksstark bedeutet, dass sich Namen zu finden lohnt sich aber. Ausdrucksstark bedeutet, dass sich
aus dem Namen ein R\"uckschluss auf den Zweck ziehen lassen sollte. aus dem Namen R\"uckschl\"usse auf den Zweck ziehen lassen sollte.
\begin{important}[Benennung von Funktionen und Skripten] \begin{important}[Benennung von Funktionen und Skripten]
Die Namen von Funktionen und Skripten sollten m\"oglichst viel \"uber Die Namen von Funktionen und Skripten sollten m\"oglichst viel \"uber
@ -136,10 +141,10 @@ die Namensgebung selbst keine weiteren Vorgaben. Allerdings folgt die
Benennung der in \matlab{} vordefinierten Funktionen gewissen Mustern: Benennung der in \matlab{} vordefinierten Funktionen gewissen Mustern:
\begin{itemize} \begin{itemize}
\item Namen werden immer klein geschrieben. \item Namen werden immer klein geschrieben.
\item Es werden gerne Abk\"urzungen eingesetzt (z.B. \code{xcorr} \item Es werden gerne Abk\"urzungen eingesetzt (z.B. \code{xcorr()}
f\"ur die Kreuzkorrelation oder \code{repmat} f\"ur ``repeat matrix'') f\"ur die Kreuzkorrelation oder \code{repmat()} f\"ur ``repeat matrix'')
\item Funktionen, die zwischen Formaten konvertieren sind immer nach \item Funktionen, die zwischen Formaten konvertieren sind immer nach
dem Muster ``format2format'' (z.B. \code{num2str} f\"ur die dem Muster ``format2format'' (z.B. \code{num2str()} f\"ur die
Konvertierung ``number to string'', Umwandlung eines numerischen Konvertierung ``number to string'', Umwandlung eines numerischen
Wertes in einen Text) benannt. Wertes in einen Text) benannt.
\end{itemize} \end{itemize}
@ -158,24 +163,24 @@ F\"ur die Bennennung von Variablen und Konstanten gelten die gleichen
Regeln wie f\"ur die Namen von Funktionen und Skripten. Die Maxime von Regeln wie f\"ur die Namen von Funktionen und Skripten. Die Maxime von
gutem Programmierstil ist: \emph{``Programmcode muss lesbar gutem Programmierstil ist: \emph{``Programmcode muss lesbar
sein.''}. Dabei helfen gute Namen ungemein. Auch wenn es schwer sein.''}. Dabei helfen gute Namen ungemein. Auch wenn es schwer
f\"allt passende und nicht zu lange Namen zu finden, sollte einer gute f\"allt passende und trotzdem nicht zu lange Namen zu finden, sollte
Namensgebung ernst genommen werden. einer gute Namensgebung sehr ernst genommen werden.
W\"ahrend die Namen von Funktionen und Skripten ihren Zweck W\"ahrend die Namen von Funktionen und Skripten ihren Zweck
beschreiben, sollten die Namen von Variablen ihren Inhalt beschreiben, sollten die Namen von Variablen ihren Inhalt
beschreiben. Eine Variable, die die mittlere Anzahl von beschreiben. Eine Variable, die die mittlere Anzahl von
Aktionspotentialen speichert, k\"onnte also Aktionspotentialen speichert, k\"onnte also
\codeterm{average\_spike\_count} hei{\ss}en. Wenn die Variable nicht \varcode{average\_spike\_count} hei{\ss}en. Wenn die Variable nicht
nur einen sondern mehrere Werte aufnimmt, dann ist der Plural nur einen sondern mehrere Werte aufnimmt, dann ist der Plural
angebracht (\codeterm{average\_spike\_counts}). angebracht (\varcode{average\_spike\_counts}).
Die Laufvariablen von \code{for}-Schleifen werden oft nur \code{i}, Die Laufvariablen von \code{for}-Schleifen werden oft nur \varcode{i},
\code{j} oder \code{k} benannt und sollten aber die einzige Ausnahme \varcode{j} oder \varcode{k} benannt und sollten aber die einzige Ausnahme
bzgl. ausdrucksstarker Namensgebung bleiben. bzgl. ausdrucksstarker Namensgebung bleiben.
\begin{important}[Benennung von Variablen] \begin{important}[Benennung von Variablen]
Die Namen von Variablen sollten m\"oglichst viel \"uber ihren Inhalt Die Namen von Variablen sollten m\"oglichst viel \"uber ihren Inhalt
aussagen (\code{spike\_count} statt \code{x}). Gute Namen aussagen (\varcode{spike\_count} statt \varcode{x}). Gute Namen
f\"ur Variablen sind die beste Dokumentation. f\"ur Variablen sind die beste Dokumentation.
\end{important} \end{important}
@ -223,7 +228,7 @@ end
end end
\end{lstlisting} \end{lstlisting}
\clearpage \pagebreak[4]
\begin{lstlisting}[label=cleancode, caption={\"Ubersichtliche Implementation des Random-walk.}] \begin{lstlisting}[label=cleancode, caption={\"Ubersichtliche Implementation des Random-walk.}]
num_runs = 10; num_runs = 10;
@ -248,7 +253,7 @@ Kommentarzeilen werden in \matlab{} mit dem Prozentzeichen \code{\%}
gekennzeichnet. Gezielt und sparsam eingesetzte Kommentare sind f\"ur gekennzeichnet. Gezielt und sparsam eingesetzte Kommentare sind f\"ur
das Verst\"andnis eines Programms sehr n\"utzlich. Am wichtigsten das Verst\"andnis eines Programms sehr n\"utzlich. Am wichtigsten
sind kurze Kommentare, die den Zweck und das Ziel eines Abschnitts im sind kurze Kommentare, die den Zweck und das Ziel eines Abschnitts im
Programm erl\"autern (z.B. \code{\% compute mean firing rate over all Programm erl\"autern (z.B. \varcode{\% compute mean firing rate over all
trials}). trials}).
Viele und h\"aufige Kommentare k\"onnen in der Entwicklungsphase eines Viele und h\"aufige Kommentare k\"onnen in der Entwicklungsphase eines
@ -259,7 +264,7 @@ Zeilen sowieso weitestgehend selbsterkl\"arend sein.
Die beste Dokumentation ist der Code selbst. Gut geschriebener Code Die beste Dokumentation ist der Code selbst. Gut geschriebener Code
mit ausdrucksstarken Variablen- und Funktionsnamen ben\"otigt keine mit ausdrucksstarken Variablen- und Funktionsnamen ben\"otigt keine
Kommentare, um den Zweck einzelner Zeilen zu erkl\"aren. z.B. ist\\ Kommentare, um den Zweck einzelner Zeilen zu erkl\"aren. z.B. ist\\
\code{ x = x + 2; \% add two to x}\\ \varcode{ x = x + 2; \% add two to x}\\
ein v\"ollig unn\"otiger Kommentar. ein v\"ollig unn\"otiger Kommentar.
\begin{important}[Verwendung von Kommentaren] \begin{important}[Verwendung von Kommentaren]
@ -270,21 +275,29 @@ ein v\"ollig unn\"otiger Kommentar.
\item Ein falscher Kommentar ist schlimmer als gar kein Kommentar! \item Ein falscher Kommentar ist schlimmer als gar kein Kommentar!
\item Kommentare m\"ussen gepflegt werden, sonst sind sie wertlos! \item Kommentare m\"ussen gepflegt werden, sonst sind sie wertlos!
\end{itemize} \end{itemize}
\widequote{Good code is its own best documentation. As you're about to add
a comment, ask yourself, ``How can I improve the code so that this
comment isn't needed?'' Improve the code and then document it to
make it even clearer.}{Steve McConnell}
\end{important} \end{important}
\pagebreak[4]
\section{Dokumentation von Funktionen} \section{Dokumentation von Funktionen}
Bei allen vordefinierten \matlab{} Funktionen findet sich am Anfang Bei allen vordefinierten \matlab{} Funktionen findet sich am Anfang
eine Kommentarblock, der den Zweck der Funktion, die verschiedenen eine Kommentarblock, der den Zweck der Funktion, die verschiedenen
M\"oglichkeiten des Funktionsaufrufs und die Argumente und M\"oglichkeiten des Funktionsaufrufs und die Argumente und
R\"uckgabewerte beschreibt. Auch in eingenen Funktionen sind diese R\"uckgabewerte beschreibt. Mit dem \code{help}- Befehl wird dieser
Kommentare sehr hilfreich. Siehe Listing~\ref{localfunctions} f\"ur Kommentarblock angezeigt. Auch in eigenen Funktionen sind
ein Beispiel einer gut Dokumentierten Funktion. diese Kommentare sehr wichtig. Siehe Listing~\ref{localfunctions}
f\"ur ein Beispiel einer gut dokumentierten Funktion.
\begin{important}[Dokumentation von Funktionen] \begin{important}[Dokumentation von Funktionen]
Funktionen m\"ussen unbedingt kommentiert werde! Funktionen m\"ussen unbedingt kommentiert werde!
\begin{itemize} \begin{itemize}
\item In wenigen Zeilen kurz den Zweck der Funktion beschreiben. \item In wenigen Zeilen kurz den Zweck der Funktion beschreiben.
\item Den Funktionskopf nocheinmal hinschreiben, damit
klar ist, in welcher Reihenfolge Argumente \"ubergeben werden.
\item F\"ur jedes Funktionsargument die Bedeutung, der erwartete \item F\"ur jedes Funktionsargument die Bedeutung, der erwartete
Datentyp (Zahl, Vektor, Matrix, etc.), und eventuell die Einheit, Datentyp (Zahl, Vektor, Matrix, etc.), und eventuell die Einheit,
in der die Zahlen erwartet werden (z.B. Sekunden). in der die Zahlen erwartet werden (z.B. Sekunden).
@ -302,7 +315,7 @@ ob dieser Teil des Programms nicht in eine eigene Funktion ausgelagert
werden sollte. Fast immer kann dies bejaht werden. werden sollte. Fast immer kann dies bejaht werden.
Abschnitte nicht auszulagern f\"uhrt zu sehr langen Abschnitte nicht auszulagern f\"uhrt zu sehr langen
\codeterm{m-Files}, die leicht un\"ubersichtlich werden. Diese Art von \codeterm{m-files}, die leicht un\"ubersichtlich werden. Diese Art von
Code wird \codeterm{Spaghetticode} genannt. Es ist h\"ochste Zeit Code wird \codeterm{Spaghetticode} genannt. Es ist h\"ochste Zeit
\"uber Auslagerung in Funktionen nachzudenken. \"uber Auslagerung in Funktionen nachzudenken.
@ -318,25 +331,31 @@ Code wird \codeterm{Spaghetticode} genannt. Es ist h\"ochste Zeit
\subsection{Lokale Funktionen und geschachtelte Funktionen} \subsection{Lokale Funktionen und geschachtelte Funktionen}
Das Auslagern von Funktionalit\"at in eigene Funktionen f\"uhrt Das Auslagern von Funktionalit\"at in eigene Funktionen f\"uhrt dazu,
dazu, dass eine F\"ulle von Dateien erzeugt wird, die die dass eine F\"ulle von Dateien erzeugt wird, die die
\"Ubersichtlichkeit nicht unbedingt erh\"oht. Wenn die auszulagernde \"Ubersichtlichkeit nicht unbedingt erh\"oht. Wenn die auszulagernde
Funktionalit\"at an vielen Stellen ben\"otigt wird ist es Funktionalit\"at an vielen Stellen ben\"otigt wird ist es dennoch sehr
dennoch sinnvoll dies zu tun. Wenn nicht, dann bietet \matlab{} die sinnvoll dies zu tun. Wenn Funktionen nur von einzelnen anderen
M\"oglichkeit sogenannte \codeterm{lokale Funktionen} oder auch Funktionen verwendet werden, dann bietet \matlab{} die M\"oglichkeit
\codeterm{geschachtelte Funktionen} (\enterm{nested functions}) zu sogenannte \codeterm[Funktion!lokale]{lokale Funktionen} oder auch
\codeterm[Funktion!geschachtelte]{geschachtelte Funktionen}
(\enterm{nested functions}) in einer einzelnen Datei zu
erstellen. Listing \ref{localfunctions} zeigt ein Beispiel f\"ur eine erstellen. Listing \ref{localfunctions} zeigt ein Beispiel f\"ur eine
lokale Funktion. lokale Funktion.
\lstinputlisting[label=localfunctions, caption={\codeterm{Lokale Funktionen} erh\"ohen die Lesbarkeit sind aber nur innerhalb der definierenden Datei verf\"ugbar.}]{calculateSines.m} \pagebreak[3]
\lstinputlisting[label=localfunctions, caption={Beispiel f\"ur den
Einsatz von lokalen Funktionen.}]{calculateSines.m}
Lokale Funktionen existieren in der gleichen Datei und sind nur dort Lokale Funktionen existieren in der gleichen Datei und sind nur dort
verf\"ugbar. Jede Funktion hat ihren eigenen G\"ultigkeitsbereich, das verf\"ugbar. Jede Funktion hat ihren eigenen G\"ultigkeitsbereich, das
hei{\ss}t, dass Variablen aus den aufrufenden Funktionen nicht hei{\ss}t, dass Variablen aus den aufrufenden Funktionen nicht
sichtbar sind. Bei sogenannten \codeterm{geschachtelten Funktionen} sichtbar sind.
ist das anders. Diese werden innerhalb eines Funktionsk\"orpers
(zwischen den Schl\"usselworten \codeterm{function} und dem Bei sogenannten \codeterm[Funktion!geschachtelte]{geschachtelten
\codeterm{end} definiert und k\"onnen auf alle Variablen der Funktionen} ist das anders. Diese werden innerhalb eines
Funktionsk\"orpers (zwischen den Schl\"usselworten \code{function} und
dem \code{end} definiert und k\"onnen auf alle Variablen der
``Mutterfunktion'' zugreifen und diese auch ver\"andern. Folglich ``Mutterfunktion'' zugreifen und diese auch ver\"andern. Folglich
sollten sie nur mit Bedacht eingesetzt werden. sollten sie nur mit Bedacht eingesetzt werden.
@ -403,8 +422,20 @@ diese sollten dann beachtet werden.
Wiederholte Programmabschnitte sollten in Funktionen ausgelagert Wiederholte Programmabschnitte sollten in Funktionen ausgelagert
werden. Wenn diese nicht von globalem Interesse sind, kann mit werden. Wenn diese nicht von globalem Interesse sind, kann mit
\codeterm{lokalen} oder \codeterm{geschachtelten Funktionen} die \codeterm[Funktion!lokale]{lokalen} oder
\"Ubersichtlichkeit erh\"oht werden. \codeterm[Funktion!geschachtelte]{geschachtelten
Funktionen} die \"Ubersichtlichkeit erh\"oht werden.
Es lohnt sich auf den eigenen Programmierstil zu
achten!\footnote{Buchtip: Robert C. Martin: \textit{Clean Code: A
Handbook of Agile Software Craftmanship}, Prentice Hall}
\shortquote{Programs must be written for people to read, and only
incidentally for machines to execute.}{Abelson / Sussman}
\shortquote{Any fool can write code that a computer can
understand. Good programmers write code that humans can
understand.}{Martin Fowler}
\noindent Es lohnt sich auf den eigenen Programmierstil zu achten!\footnote{Literatur zum Programmierstil: z.B. Robert C. Martin: \textit{Clean \shortquote{First, solve the problem. Then, write the code.}{John
Code: A Handbook of Agile Software Craftmanship}, Prentice Hall} Johnson}

View File

@ -1,5 +1,4 @@
load('lin_regression.mat') load('lin_regression.mat')
ms = -1:0.5:5; ms = -1:0.5:5;
ns = -10:1:10; ns = -10:1:10;

View File

@ -7,11 +7,8 @@ function gradient = lsqGradient(parameter, x, y)
% y, vector of the corresponding measured output values % y, vector of the corresponding measured output values
% %
% Returns: the gradient as a vector with two elements % Returns: the gradient as a vector with two elements
h = 1e-6; % stepsize for derivatives h = 1e-6; % stepsize for derivatives
partial_m = (lsqError([parameter(1)+h, parameter(2)], x, y) - lsqError(parameter, x, y))/ 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; partial_n = (lsqError([parameter(1), parameter(2)+h], x, y) - lsqError(parameter, x, y))/ h;
gradient = [partial_m, partial_n]; gradient = [partial_m, partial_n];
end end

View File

@ -1,32 +1,12 @@
BASENAME=regression BASENAME=regression
PYFILES=$(wildcard *.py)
PYPDFFILES=$(PYFILES:.py=.pdf)
all : pdf all : pdf
# script: include ../../chapter.mk
pdf : $(BASENAME)-chapter.pdf
$(BASENAME)-chapter.pdf : $(BASENAME)-chapter.tex $(BASENAME).tex $(PYPDFFILES)
CHAPTER=$$(( $$(sed -n -e '/contentsline {chapter}/{s/.*numberline {\([0123456789]*\)}.*/\1/; p}' $(BASENAME).aux) - 1 )); \
PAGE=$$(sed -n -e '/contentsline {chapter}/{s/.*numberline {.*}.*}{\(.*\)}{chapter.*/\1/; p}' $(BASENAME).aux); \
sed -i -e "s/setcounter{page}{.*}/setcounter{page}{$$PAGE}/; s/setcounter{chapter}{.*}/setcounter{chapter}{$$CHAPTER}/" $(BASENAME)-chapter.tex
pdflatex -interaction=scrollmode $< | tee /dev/stderr | fgrep -q "Rerun to get cross-references right" && pdflatex -interaction=scrollmode $< || true
$(PYPDFFILES) : %.pdf : %.py
python $<
clean : # script:
rm -f *~ pdf : chapter
rm -f $(BASENAME).aux $(BASENAME).log
rm -f $(BASENAME)-chapter.aux $(BASENAME)-chapter.log $(BASENAME)-chapter.out
rm -f $(PYPDFFILES) $(GPTTEXFILES)
cleanall : clean
rm -f $(BASENAME)-chapter.pdf
watchpdf :
while true; do ! make -q pdf && make pdf; sleep 0.5; done
clean : cleanchapter
cleanall : clean cleanchapter

View File

@ -5,8 +5,10 @@
\lstset{inputpath=../code} \lstset{inputpath=../code}
\graphicspath{{figures/}} \graphicspath{{figures/}}
\setcounter{page}{89} \typein[\pagenumber]{Number of first page}
\setcounter{chapter}{5} \typein[\chapternumber]{Chapter number}
\setcounter{page}{\pagenumber}
\setcounter{chapter}{\chapternumber}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

View File

@ -68,9 +68,9 @@ Summe k\"onnen wir genauso gut fordern, dass der \emph{mittlere} Abstand
der Menge der $N$ Datenpaare $(x_i, y_i)$ gegeben die Modellvorhersagen der Menge der $N$ Datenpaare $(x_i, y_i)$ gegeben die Modellvorhersagen
$y_i^{est}$ klein sein soll. $y_i^{est}$ klein sein soll.
Am h\"aufigsten wird jedoch bei einem Kurvenfit der \determ{mittlere Am h\"aufigsten wird jedoch bei einem Kurvenfit der \determ[mittlerer
quadratische Abstand} (\enterm{mean squared distance} oder quadratische Abstand]{mittlere quadratische Abstand} (\enterm{mean
\enterm{mean squared error}) squared distance} oder \enterm{mean squared error})
\begin{equation} \begin{equation}
\label{meansquarederror} \label{meansquarederror}
f_{mse}(\{(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
@ -81,10 +81,11 @@ quadratischen Abst\"ande immer positiv, unabh\"angig ob die Datenwerte
zus\"atzlich gro{\ss}e Abst\"ande st\"arker gewichtet. zus\"atzlich gro{\ss}e Abst\"ande st\"arker gewichtet.
\begin{exercise}{meanSquareError.m}{}\label{mseexercise}% \begin{exercise}{meanSquareError.m}{}\label{mseexercise}%
Schreibe eine Funktion \code{meanSquareError}, die die mittlere Schreibe eine Funktion \code{meanSquareError()}, die die mittlere
quadratische Abweichung zwischen einem Vektor mit den beobachteten quadratische Abweichung zwischen einem Vektor mit den beobachteten
Werten $y$ und einem Vektor mit den entsprechenden Vorhersagen Werten $y$ und einem Vektor mit den entsprechenden Vorhersagen
$y^{est}$ berechnet.\newpage $y^{est}$ berechnet.
\pagebreak[4]
\end{exercise} \end{exercise}
@ -130,20 +131,21 @@ f\"ur die Zielfunktion
den mittleren quadratischen Abstand der Datenpaare $(x_i, y_i)$ den mittleren quadratischen Abstand der Datenpaare $(x_i, y_i)$
gegeben die Parameterwerte $m$ und $b$ der Geradengleichung. Ziel des gegeben die Parameterwerte $m$ und $b$ der Geradengleichung. Ziel des
Kurvenfits ist es, die Werte f\"ur $m$ und $b$ so zu optimieren, dass Kurvenfits ist es, die Werte f\"ur $m$ und $b$ so zu optimieren, dass
der Fehler \eqnref{mseline} minimal wird. der Fehler \eqnref{mseline} minimal wird (\determ{Methode der
kleinsten Quadrate}, \enterm{least square error}).
\begin{exercise}{lsqError.m}{} \begin{exercise}{lsqError.m}{}
Implementiere die Zielfunktion f\"ur die Optimierung mit der Implementiere die Zielfunktion f\"ur die Optimierung mit der
linearen Geradengleichung als Funktion \code{lsqError}. linearen Geradengleichung als Funktion \code{lsqError()}.
\begin{itemize} \begin{itemize}
\item Die Funktion \"ubernimmt drei Argumente: Das erste Argument \item Die Funktion \"ubernimmt drei Argumente: Das erste Argument
ist ein 2-elementiger Vektor, der die Parameter \code{m} und ist ein 2-elementiger Vektor, der die Parameter \varcode{m} und
\code{b} enth\"alt. Das zweite ist ein Vektor mit den $x$-Werten, \varcode{b} enth\"alt. Das zweite ist ein Vektor mit den $x$-Werten,
an denen gemessen wurde, und das dritte ein Vektor mit den an denen gemessen wurde, und das dritte ein Vektor mit den
zugeh\"origen $y$-Werten. zugeh\"origen $y$-Werten.
\item Die Funktion gibt als Ergebniss den Fehler als mittleren \item Die Funktion gibt als Ergebniss den Fehler als mittleren
quadratischen Abstand \eqnref{mseline} zur\"uck. quadratischen Abstand \eqnref{mseline} zur\"uck.
\item Die Funktion soll die Funktion \code{meanSquareError} der \item Die Funktion soll die Funktion \code{meanSquareError()} der
vorherigen \"Ubung benutzen. vorherigen \"Ubung benutzen.
\end{itemize} \end{itemize}
\end{exercise} \end{exercise}
@ -160,7 +162,7 @@ $f_{cost}(m,b)$, die die beiden Variablen $m$ und $b$ auf einen
Fehlerwert abbildet. Fehlerwert abbildet.
Es gibt also f\"ur jeden Punkt in der sogenannten Es gibt also f\"ur jeden Punkt in der sogenannten
\emph{Fehlerfl\"ache} einen Fehlerwert. In diesem Beispiel eines \determ{Fehlerfl\"ache} einen Fehlerwert. In diesem Beispiel eines
2-dimensionalen Problems (zwei freie Parameter) kann die 2-dimensionalen Problems (zwei freie Parameter) kann die
Fehlerfl\"ache graphisch durch einen 3-d \enterm{surface-plot} Fehlerfl\"ache graphisch durch einen 3-d \enterm{surface-plot}
dargestellt werden. Dabei werden auf der $x$- und der $y$-Achse die dargestellt werden. Dabei werden auf der $x$- und der $y$-Achse die
@ -181,12 +183,12 @@ beiden Parameter und auf der $z$-Achse der Fehlerwert aufgetragen
\begin{exercise}{errorSurface.m}{}\label{errorsurfaceexercise}% \begin{exercise}{errorSurface.m}{}\label{errorsurfaceexercise}%
Lade den Datensatz \textit{lin\_regression.mat} in den Workspace (20 Lade den Datensatz \textit{lin\_regression.mat} in den Workspace (20
Datenpaare in den Vektoren \code{x} und \code{y}). Schreibe ein Skript Datenpaare in den Vektoren \varcode{x} und \varcode{y}). Schreibe ein Skript
\file{errorSurface.m}, dass den Fehler, berechnet als mittleren \file{errorSurface.m}, dass den Fehler, berechnet als mittleren
quadratischen Abstand zwischen den Daten und einer Geraden mit quadratischen Abstand zwischen den Daten und einer Geraden mit
Steigung $m$ und $y$-Achsenabschnitt $b$, in Abh\"angigkeit von $m$ Steigung $m$ und $y$-Achsenabschnitt $b$, in Abh\"angigkeit von $m$
und $b$ als surface plot darstellt (siehe Hilfe f\"ur die und $b$ als surface plot darstellt (siehe Hilfe f\"ur die
\code{surf} Funktion). \code{surf()} Funktion).
\end{exercise} \end{exercise}
An der Fehlerfl\"ache kann direkt erkannt werden, bei welcher An der Fehlerfl\"ache kann direkt erkannt werden, bei welcher
@ -278,7 +280,7 @@ Kostenfunktion verwenden. Da die Kugel immer entlang des steilsten
Gef\"alles rollt, ben\"otigen wir Information \"uber die Richtung des Gef\"alles rollt, ben\"otigen wir Information \"uber die Richtung des
Gef\"alles an der jeweils aktuellen Position. Gef\"alles an der jeweils aktuellen Position.
Der Gradient (Box~\ref{partialderivativebox}) der Kostenfunktion Der \determ{Gradient} (Box~\ref{partialderivativebox}) der Kostenfunktion
\[ \nabla f_{cost}(m,b) = \left( \frac{\partial e(m,b)}{\partial m}, \[ \nabla f_{cost}(m,b) = \left( \frac{\partial e(m,b)}{\partial m},
\frac{\partial f(m,b)}{\partial b} \right) \] bzgl. der beiden \frac{\partial f(m,b)}{\partial b} \right) \] bzgl. der beiden
Parameter $m$ und $b$ der Geradengleichung ist ein Vektor, der in Parameter $m$ und $b$ der Geradengleichung ist ein Vektor, der in
@ -299,7 +301,7 @@ partielle Ableitung nach $m$ durch
\begin{figure}[t] \begin{figure}[t]
\includegraphics[width=0.75\columnwidth]{error_gradient} \includegraphics[width=0.75\columnwidth]{error_gradient}
\titlecaption{Der Gradienten der Fehlerfl\"ache.} \titlecaption{Gradient der Fehlerfl\"ache.}
{Jeder Pfeil zeigt die Richtung und die {Jeder Pfeil zeigt die Richtung und die
Steigung f\"ur verschiedene Parameterkombination aus Steigung und Steigung f\"ur verschiedene Parameterkombination aus Steigung und
$y$-Achsenabschnitt an. Die Kontourlinien im Hintergrund $y$-Achsenabschnitt an. Die Kontourlinien im Hintergrund
@ -310,7 +312,7 @@ partielle Ableitung nach $m$ durch
\end{figure} \end{figure}
\begin{exercise}{lsqGradient.m}{}\label{gradientexercise}% \begin{exercise}{lsqGradient.m}{}\label{gradientexercise}%
Implementiere eine Funktion \code{lsqGradient}, die den Implementiere eine Funktion \code{lsqGradient()}, die den
Parametersatz $(m, b)$ der Geradengleichung als 2-elementigen Vektor Parametersatz $(m, b)$ der Geradengleichung als 2-elementigen Vektor
sowie die $x$- und $y$-Werte der Messdaten als Argumente sowie die $x$- und $y$-Werte der Messdaten als Argumente
entgegennimmt und den Gradienten an dieser Stelle zur\"uckgibt. entgegennimmt und den Gradienten an dieser Stelle zur\"uckgibt.
@ -321,17 +323,17 @@ partielle Ableitung nach $m$ durch
um f\"ur jede Parameterkombination aus der Fehlerfl\"ache um f\"ur jede Parameterkombination aus der Fehlerfl\"ache
(\"Ubung \ref{errorsurfaceexercise}) auch den Gradienten zu (\"Ubung \ref{errorsurfaceexercise}) auch den Gradienten zu
berechnen und darzustellen. Vektoren im Raum k\"onnen mithilfe der berechnen und darzustellen. Vektoren im Raum k\"onnen mithilfe der
Funktion \code{quiver} geplottet werden. Funktion \code{quiver()} geplottet werden.
\end{exercise} \end{exercise}
\section{Gradientenabstieg} \section{Gradientenabstieg}
Zu guter Letzt muss nur noch der Gradientenabstieg implementiert Zu guter Letzt muss nur noch der \determ{Gradientenabstieg} implementiert
werden. Die daf\"ur ben\"otigten Zutaten haben wir aus den werden. Die daf\"ur ben\"otigten Zutaten haben wir aus den
vorangegangenen \"Ubungen bereits vorbereitet. Wir brauchen: 1. Die Fehlerfunktion vorangegangenen \"Ubungen bereits vorbereitet. Wir brauchen: 1. Die Fehlerfunktion
(\code{meanSquareError.m}), 2. die Zielfunktion (\code{lsqError.m}) (\code{meanSquareError()}), 2. die Zielfunktion (\code{lsqError()})
und 3. den Gradienten (\code{lsqGradient.m}). Der Algorithmus und 3. den Gradienten (\code{lsqGradient()}). Der Algorithmus
f\"ur den Abstieg lautet: f\"ur den Abstieg lautet:
\begin{enumerate} \begin{enumerate}
\item Starte mit einer beliebigen Parameterkombination $p_0 = (m_0, \item Starte mit einer beliebigen Parameterkombination $p_0 = (m_0,
@ -342,7 +344,7 @@ f\"ur den Abstieg lautet:
abbrechen. Wir suchen ja das Minimum, bei dem der Gradient gleich abbrechen. Wir suchen ja das Minimum, bei dem der Gradient gleich
Null ist. Da aus numerischen Gr\"unden der Gradient nie exakt Null Null ist. Da aus numerischen Gr\"unden der Gradient nie exakt Null
werden wird, k\"onnen wir nur fordern, dass er hinreichend klein werden wird, k\"onnen wir nur fordern, dass er hinreichend klein
wird (z.B. \code{norm(gradient) < 0.1}). wird (z.B. \varcode{norm(gradient) < 0.1}).
\item \label{gradientstep} Gehe einen kleinen Schritt ($\epsilon = \item \label{gradientstep} Gehe einen kleinen Schritt ($\epsilon =
0.01$) in die entgegensetzte Richtung des Gradienten: 0.01$) in die entgegensetzte Richtung des Gradienten:
\[p_{i+1} = p_i - \epsilon \cdot \nabla f_{cost}(m_i, b_i)\] \[p_{i+1} = p_i - \epsilon \cdot \nabla f_{cost}(m_i, b_i)\]
@ -367,7 +369,7 @@ Punkte in Abbildung \ref{gradientdescentfig} gro{\ss}.
\begin{exercise}{gradientDescent.m}{} \begin{exercise}{gradientDescent.m}{}
Implementiere den Gradientenabstieg f\"ur das Problem der Implementiere den Gradientenabstieg f\"ur das Problem der
Parameteranpassung der linearen Geradengleichung an die Messdaten in Parameteranpassung der linearen Geradengleichung an die Messdaten in
der Datei \code{lin\_regression.mat}. der Datei \file{lin\_regression.mat}.
\begin{enumerate} \begin{enumerate}
\item Merke Dir f\"ur jeden Schritt den Fehler zwischen \item Merke Dir f\"ur jeden Schritt den Fehler zwischen
Modellvorhersage und Daten. Modellvorhersage und Daten.
@ -388,7 +390,7 @@ mittlere quadratische Abstand als Kostenfunktion in der Tat ein
einziges klar definiertes Minimum. Wie wir im n\"achsten Kapitel einziges klar definiertes Minimum. Wie wir im n\"achsten Kapitel
sehen werden, kann die Position des Minimums bei Geradengleichungen sehen werden, kann die Position des Minimums bei Geradengleichungen
sogar analytisch bestimmt werden, der Gradientenabstieg w\"are also sogar analytisch bestimmt werden, der Gradientenabstieg w\"are also
gar nicht n\"otig \matlabfun{polyfit}. gar nicht n\"otig \matlabfun{polyfit()}.
F\"ur Parameter, die nichtlinear in einer Funktion F\"ur Parameter, die nichtlinear in einer Funktion
enthalten sind, wie z.B. die Rate $\lambda$ als Parameter in der enthalten sind, wie z.B. die Rate $\lambda$ als Parameter in der
@ -401,9 +403,9 @@ Gradientenabstiegs auf vielf\"altige Weise verbessert
werden. z.B. kann die Schrittweite an die St\"arke des Gradienten werden. z.B. kann die Schrittweite an die St\"arke des Gradienten
angepasst werden. Diese numerischen Tricks sind in bereits vorhandenen angepasst werden. Diese numerischen Tricks sind in bereits vorhandenen
Funktionen implementiert. Allgemeine Funktionen sind f\"ur beliebige Funktionen implementiert. Allgemeine Funktionen sind f\"ur beliebige
Kostenfunktionen gemacht \matlabfun{fminsearch}, w\"ahrend spezielle Kostenfunktionen gemacht \matlabfun{fminsearch()}, w\"ahrend spezielle
Funktionen z.B. f\"ur die Minimierung des quadratischen Abstands bei Funktionen z.B. f\"ur die Minimierung des quadratischen Abstands bei
einem Kurvenfit angeboten werden \matlabfun{lsqcurvefit}. einem Kurvenfit angeboten werden \matlabfun{lsqcurvefit()}.
\begin{important}[Achtung Nebenminima!] \begin{important}[Achtung Nebenminima!]
Das Finden des globalen Minimums ist leider nur selten so leicht wie Das Finden des globalen Minimums ist leider nur selten so leicht wie

View File

@ -8,14 +8,20 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{document} \begin{document}
\hypersetup{pageanchor=false}
\maketitle \maketitle
\hypersetup{pageanchor=true}
\frontmatter
\tableofcontents \tableofcontents
\listoffigures \listoffigures
\lstlistoflistings \lstlistoflistings
\listofexercisefs \listofexercisefs
\listofiboxfs \listofiboxfs
%\listofimportantfs
\mainmatter
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\part{Grundlagen des Programmierens} \part{Grundlagen des Programmierens}
@ -67,9 +73,14 @@
%\chapter{Cheat-Sheet} %\chapter{Cheat-Sheet}
\addcontentsline{toc}{chapter}{Fachbegriffe} \backmatter
%%%% indices: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\printindex[term] \printindex[term]
\addcontentsline{toc}{chapter}{Code}
\printindex[enterm]
%\setindexprenote{Some explanations.}
\printindex[code] \printindex[code]
\end{document} \end{document}

View File

@ -1,9 +1,9 @@
% check whether the median returned by mymedian % check whether the median returned by mymedian
% really separates a vector into two halfs % really separates a vector into two halfs
for i = 1:140 % loop over different length for i = 1:140 % loop over different length
for k = 1:10 % try several times for k = 1:10 % try several times
a = randn( i, 1 ); % generate some data a = randn( i, 1 ); % generate some data
m = mymedian( a ); % compute median m = mymedian( a ); % compute median
if length( a(a>m) ) ~= length( a(a<m) ) % check if length( a(a>m) ) ~= length( a(a<m) ) % check
disp( 'error!' ) disp( 'error!' )
end end

View File

@ -1,15 +1,14 @@
x = randn( 100, 1 ); % generate some data x = randn(100, 1); % generate some data
db1=2;
db2 = 0.5; bins1 = -4:2:4; % large bins
bins1 = -4:db1:4; % large bins bins2 = -4:0.5:4; % small bins
bins2 = -4:db2:4; % small bins
[h1,b1] = hist(x,bins1); [h1,b1] = hist(x,bins1);
[h2,b2] = hist(x,bins2); [h2,b2] = hist(x,bins2);
subplot( 1, 2, 1 ); subplot( 1, 2, 1 );
bar(b1,h1) bar(b1, h1)
hold on hold on
bar(b2,h2, 'facecolor', 'r' ) bar(b2, h2, 'facecolor', 'r' )
xlabel('x') xlabel('x')
ylabel('Frequency') ylabel('Frequency')
hold off hold off

View File

@ -12,16 +12,15 @@ hold off
% compute integral between x1 and x2: % compute integral between x1 and x2:
P = sum(p((x>=x1)&(x<x2)))*dx; P = sum(p((x>=x1)&(x<x2)))*dx;
fprintf( 'The integral between %.2g and %.2g is %.3g\n', x1, x2, P ); fprintf( 'Integral between %.2g and %.2g: %.3g\n', x1, x2, P );
% draw random numbers: % draw random numbers:
r = randn( 10000, 1 ); r = randn( 10000, 1 );
% check P: % check P:
Pr = sum((r>=x1)&(r<x2))/length(r); Pr = sum((r>=x1)&(r<x2))/length(r);
fprintf( 'The probability of getting a number between %.2g and %.2g is %.3g\n', x1, x2, Pr ); fprintf( 'Probability of a number between %.2g and %.2g: %.3g\n', x1, x2, Pr );
% infinite integral: % infinite integral:
P = sum(p)*dx; P = sum(p)*dx;
fprintf( 'The integral between -infinity and +infinity is %.3g\n', P ); fprintf( 'Integral between -infinity and +infinity: %.3g\n', P );
fprintf( 'I.e. the probability to get any number is %.3g\n', P );

View File

@ -1,32 +1,12 @@
BASENAME=statistics BASENAME=statistics
PYFILES=$(wildcard *.py)
PYPDFFILES=$(PYFILES:.py=.pdf)
all : pdf all : pdf
# script: include ../../chapter.mk
pdf : $(BASENAME)-chapter.pdf
$(BASENAME)-chapter.pdf : $(BASENAME)-chapter.tex $(BASENAME).tex $(PYPDFFILES) ../../header.tex
CHAPTER=$$(( $$(sed -n -e '/contentsline {chapter}/{s/.*numberline {\([0123456789]*\)}.*/\1/; p}' $(BASENAME).aux) - 1 )); \
PAGE=$$(sed -n -e '/contentsline {chapter}/{s/.*numberline {.*}.*}{\(.*\)}{chapter.*/\1/; p}' $(BASENAME).aux); \
sed -i -e "s/setcounter{page}{.*}/setcounter{page}{$$PAGE}/; s/setcounter{chapter}{.*}/setcounter{chapter}{$$CHAPTER}/" $(BASENAME)-chapter.tex
pdflatex -interaction=scrollmode $< | tee /dev/stderr | fgrep -q "Rerun to get cross-references right" && pdflatex -interaction=scrollmode $< || true
$(PYPDFFILES) : %.pdf : %.py
python $<
clean : # script:
rm -f *~ pdf : chapter
rm -f $(BASENAME).aux $(BASENAME).log
rm -f $(BASENAME)-chapter.aux $(BASENAME)-chapter.log $(BASENAME)-chapter.out
rm -f $(PYPDFFILES) $(GPTTEXFILES)
cleanall : clean
rm -f $(BASENAME)-chapter.pdf
watchpdf :
while true; do ! make -q pdf && make pdf; sleep 0.5; done
clean : cleanchapter
cleanall : clean cleanchapter

View File

@ -5,7 +5,7 @@ rng = np.random.RandomState(981)
x = rng.randn( 40, 10 ) x = rng.randn( 40, 10 )
plt.xkcd() plt.xkcd()
fig = plt.figure( figsize=(6,4) ) fig = plt.figure( figsize=(6,3.4) )
ax = fig.add_subplot( 1, 1, 1 ) ax = fig.add_subplot( 1, 1, 1 )
ax.spines['right'].set_visible(False) ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False) ax.spines['top'].set_visible(False)

View File

@ -8,7 +8,7 @@ x1=0.0
x2=1.0 x2=1.0
plt.xkcd() plt.xkcd()
fig = plt.figure( figsize=(6,3.8) ) fig = plt.figure( figsize=(6,3.4) )
ax = fig.add_subplot( 1, 1, 1 ) ax = fig.add_subplot( 1, 1, 1 )
ax.spines['right'].set_visible(False) ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False) ax.spines['top'].set_visible(False)

View File

@ -7,7 +7,7 @@ g = np.exp(-0.5*x*x)/np.sqrt(2.0*np.pi)
q = [ -0.67488, 0.0, 0.67488 ] q = [ -0.67488, 0.0, 0.67488 ]
plt.xkcd() plt.xkcd()
fig = plt.figure( figsize=(6,4) ) fig = plt.figure( figsize=(6,3.4) )
ax = fig.add_subplot( 1, 1, 1 ) ax = fig.add_subplot( 1, 1, 1 )
ax.spines['right'].set_visible(False) ax.spines['right'].set_visible(False)
ax.spines['top'].set_visible(False) ax.spines['top'].set_visible(False)

View File

@ -5,8 +5,10 @@
\lstset{inputpath=../code} \lstset{inputpath=../code}
\graphicspath{{figures/}} \graphicspath{{figures/}}
\setcounter{page}{69} \typein[\pagenumber]{Number of first page}
\setcounter{chapter}{3} \typein[\chapternumber]{Chapter number}
\setcounter{page}{\pagenumber}
\setcounter{chapter}{\chapternumber}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -14,6 +16,13 @@
\input{statistics} \input{statistics}
\section{TODO}
\begin{itemize}
\item Proper introduction to probabilities and densities first!
\item Cumulative propability
\item Kernel Histogramms (important for convolved PSTH)!
\end{itemize}
\end{document} \end{document}

View File

@ -34,17 +34,17 @@ der Daten eingesetzt:
nicht unbedingt identsich mit dem Modus.} nicht unbedingt identsich mit dem Modus.}
\end{figure} \end{figure}
Der Modus ist der h\"aufigste Wert, d.h. die Position des Maximums Der \determ{Modus} ist der h\"aufigste Wert, d.h. die Position des Maximums
einer Wahrscheinlichkeitsverteilung. einer Wahrscheinlichkeitsverteilung.
Der Median teilt eine Liste von Messwerten so in zwei H\"alften, dass Der \determ{Median} teilt eine Liste von Messwerten so in zwei H\"alften, dass
die eine H\"alfte der Daten nicht gr\"o{\ss}er und die andere H\"alfte die eine H\"alfte der Daten nicht gr\"o{\ss}er und die andere H\"alfte
nicht kleiner als der Median ist (\figref{medianfig}). nicht kleiner als der Median ist (\figref{medianfig}).
\newpage \newpage
\begin{exercise}{mymedian.m}{} \begin{exercise}{mymedian.m}{}
\tr{Write a function \code{mymedian} that computes the median of a vector.} \tr{Write a function \code{mymedian()} that computes the median of a vector.}
{Schreibe eine Funktion \code{mymedian}, die den Median eines Vektors zur\"uckgibt.} {Schreibe eine Funktion \code{mymedian()}, die den Median eines Vektors zur\"uckgibt.}
\end{exercise} \end{exercise}
\matlab{} stellt die Funktion \code{median()} zur Berechnung des Medians bereit. \matlab{} stellt die Funktion \code{median()} zur Berechnung des Medians bereit.
@ -55,22 +55,23 @@ nicht kleiner als der Median ist (\figref{medianfig}).
returns a median above which are the same number of data than returns a median above which are the same number of data than
below. In particular the script should test data vectors of below. In particular the script should test data vectors of
different length.} {Schreibe ein Skript, das testet ob die different length.} {Schreibe ein Skript, das testet ob die
\code{mymedian} Funktion wirklich die Zahl zur\"uckgibt, \"uber \code{mymedian()} Funktion wirklich die Zahl zur\"uckgibt, \"uber
der genauso viele Datenwerte liegen wie darunter. Das Skript sollte der genauso viele Datenwerte liegen wie darunter. Das Skript sollte
insbesondere verschieden lange Datenvektoren testen.} insbesondere verschieden lange Datenvektoren testen.}
\end{exercise} \end{exercise}
Eine Wahrscheinlichkeitsverteilung kann weiter durch die Position
ihrere Quartile charakterisiert werden. Zwischen den Quartilen liegen
jeweils 25\,\% der Daten (\figref{quartilefig}). Perzentile erlauben
eine feinere Einteilung. Das 3. Quartil ist das 75. Perzentil, da
75\,\% der Daten unterhalb des 3. Quartils liegen.
\begin{figure}[t] \begin{figure}[t]
\includegraphics[width=1\textwidth]{quartile} \includegraphics[width=1\textwidth]{quartile}
\titlecaption{\label{quartilefig} Median und Quartile einer Normalverteilung.}{} \titlecaption{\label{quartilefig} Median und Quartile einer Normalverteilung.}{}
\end{figure} \end{figure}
Eine Wahrscheinlichkeitsverteilung kann weiter durch die Position
ihrere \determ[Quartil]{Quartile} charakterisiert werden. Zwischen den
Quartilen liegen jeweils 25\,\% der Daten
(\figref{quartilefig}). Perzentile erlauben eine feinere
Einteilung. Das 3. Quartil ist das 75. Perzentil, da 75\,\% der Daten
unterhalb des 3. Quartils liegen.
% \begin{definition}[\tr{quartile}{Quartile}] % \begin{definition}[\tr{quartile}{Quartile}]
% Die Quartile Q1, Q2 und Q3 unterteilen die Daten in vier gleich % Die Quartile Q1, Q2 und Q3 unterteilen die Daten in vier gleich
% gro{\ss}e Gruppen, die jeweils ein Viertel der Daten enthalten. % gro{\ss}e Gruppen, die jeweils ein Viertel der Daten enthalten.
@ -90,11 +91,11 @@ eine feinere Einteilung. Das 3. Quartil ist das 75. Perzentil, da
normalverteilte Zufallszahlen.} normalverteilte Zufallszahlen.}
\end{figure} \end{figure}
Box-Whisker Plots sind eine h\"aufig verwendete Darstellung um die \determ{Box-Whisker Plots} sind eine h\"aufig verwendete Darstellung
Verteilung unimodaler Daten zu visualisieren und vergleichbar zu um die Verteilung unimodaler Daten zu visualisieren und vergleichbar
machen mit anderen Daten. Dabei wird um den Median eine Box vom 1. zum zu machen mit anderen Daten. Dabei wird um den Median eine Box vom
3. Quartil gezeichnet. Die Whiskers deuten den minimalen und den 1. zum 3. Quartil gezeichnet. Die Whiskers deuten den minimalen und
maximalen Datenwert an (\figref{boxwhiskerfig}). den maximalen Datenwert an (\figref{boxwhiskerfig}).
\begin{exercise}{boxwhisker.m}{} \begin{exercise}{boxwhisker.m}{}
\tr{Generate eine $40 \times 10$ matrix of random numbers and \tr{Generate eine $40 \times 10$ matrix of random numbers and
@ -111,25 +112,12 @@ maximalen Datenwert an (\figref{boxwhiskerfig}).
\section{\tr{Histogram}{Histogramm}} \section{\tr{Histogram}{Histogramm}}
Histogramme z\"ahlen die H\"aufigkeit $n_i$ des Auftretens von \determ[Histogramm]{Histogramme} z\"ahlen die H\"aufigkeit $n_i$ des
$N=\sum_{i=1}^M n_i$ Messwerten in $M$ Messbereichsklassen $i$ (Bins). Auftretens von $N=\sum_{i=1}^M n_i$ Messwerten in $M$
Die Klassen unterteilen den Wertebereich meist in angrenzende und Messbereichsklassen $i$ (Bins). Die Klassen unterteilen den
gleich gro{\ss}e Intervalle. Histogramme k\"onnen verwendet werden, um die Wertebereich meist in angrenzende und gleich gro{\ss}e Intervalle.
Wahrscheinlichkeitsverteilung der Messwerte abzusch\"atzen. Histogramme k\"onnen verwendet werden, um die
\determ{Wahrscheinlichkeitsverteilung} der Messwerte abzusch\"atzen.
\begin{exercise}{rollthedie.m}{}
\tr{Write a function that simulates rolling a die $n$ times.}
{Schreibe eine Funktion, die das $n$-malige W\"urfeln mit einem W\"urfel simuliert.}
\end{exercise}
\begin{exercise}{diehistograms.m}{}
\tr{Plot histograms from rolling the die 20, 100, 1000 times. Use
the plain hist(x) function, force 6 bins via hist( x, 6 ), and set
meaningfull bins positions.} {Plotte Histogramme von 20, 100, und
1000-mal w\"urfeln. Benutze \code{hist(x)}, erzwinge sechs Bins
mit \code{hist(x,6)}, oder setze selbst sinnvolle Bins. Normiere
anschliessend das Histogram auf geeignete Weise.}
\end{exercise}
\begin{figure}[t] \begin{figure}[t]
\includegraphics[width=1\textwidth]{diehistograms} \includegraphics[width=1\textwidth]{diehistograms}
@ -141,7 +129,6 @@ Wahrscheinlichkeitsverteilung der Messwerte abzusch\"atzen.
vergleichbar.} vergleichbar.}
\end{figure} \end{figure}
\newpage
Bei ganzzahligen Messdaten (z.B. die Augenzahl eines W\"urfels oder Bei ganzzahligen Messdaten (z.B. die Augenzahl eines W\"urfels oder
die Anzahl von Aktionspotentialen in einem bestimmten Zeitfenster) die Anzahl von Aktionspotentialen in einem bestimmten Zeitfenster)
kann f\"ur jede auftretende Zahl eine Klasse definiert werden. Damit kann f\"ur jede auftretende Zahl eine Klasse definiert werden. Damit
@ -152,6 +139,18 @@ Histogrammbalken gibt dann die Wahrscheinlichkeit $P(x_i)$ des
Auftretens der Gr\"o{\ss}e $x_i$ in der $i$-ten Klasse an Auftretens der Gr\"o{\ss}e $x_i$ in der $i$-ten Klasse an
\[ P_i = \frac{n_i}{N} = \frac{n_i}{\sum_{i=1}^M n_i} \; . \] \[ P_i = \frac{n_i}{N} = \frac{n_i}{\sum_{i=1}^M n_i} \; . \]
\begin{exercise}{rollthedie.m}{}
\tr{Write a function that simulates rolling a die $n$ times.}
{Schreibe eine Funktion, die das $n$-malige W\"urfeln mit einem W\"urfel simuliert.}
\end{exercise}
\begin{exercise}{diehistograms.m}{}
Plotte Histogramme von 20, 100, und 1000-mal W\"urfeln. Benutze
\code[hist()]{hist(x)}, erzwinge sechs Bins mit
\code[hist()]{hist(x,6)}, oder setze selbst sinnvolle Bins. Normiere
anschliessend das Histogram.
\end{exercise}
\section{\tr{Probability density function}{Wahrscheinlichkeitsdichte}} \section{\tr{Probability density function}{Wahrscheinlichkeitsdichte}}
@ -171,7 +170,7 @@ Im Grenzwert zu sehr kleinen Bereichen $\Delta x$ ist die Wahrscheinlichkeit
eines Wertes $x$ zwischen $x_0$ und $x_0+\Delta x$ eines Wertes $x$ zwischen $x_0$ und $x_0+\Delta x$
\[ P(x_0<x<x_0+\Delta x) \approx p(x) \cdot \Delta x \; . \] \[ P(x_0<x<x_0+\Delta x) \approx p(x) \cdot \Delta x \; . \]
Die Gr\"o{\ss}e $p(x)$ ist eine sogenannte Die Gr\"o{\ss}e $p(x)$ ist eine sogenannte
``Wahrscheinlichkeitsdichte''. Sie ist keine einheitenlose \determ{Wahrscheinlichkeitsdichte}. Sie ist keine einheitenlose
Wahrscheinlichkeit mit Werten zwischen Null und Eins, sondern kann Wahrscheinlichkeit mit Werten zwischen Null und Eins, sondern kann
jeden positiven Wert annehmen und hat als Einheit den Kehrwert der jeden positiven Wert annehmen und hat als Einheit den Kehrwert der
Einheit von $x$. Einheit von $x$.
@ -190,19 +189,21 @@ Da die Wahrscheinlichkeit irgendeines Wertes $x$ Eins ergeben muss gilt die Norm
\label{pdfnorm} \label{pdfnorm}
P(-\infty < x < \infty) = \int\limits_{-\infty}^{+\infty} p(x) \, dx = 1 \; . P(-\infty < x < \infty) = \int\limits_{-\infty}^{+\infty} p(x) \, dx = 1 \; .
\end{equation} \end{equation}
\pagebreak[2]
Die gesamte Funktion $p(x)$, die jedem Wert $x$ einen Die gesamte Funktion $p(x)$, die jedem Wert $x$ einen
Wahrscheinlichkeitsdichte zuordnet wir auch Wahrscheinlichkeitsdichte zuordnet wir auch
Wahrscheinlichkeitsdichtefunktion (``probability density function'', \determ{Wahrscheinlichkeitsdichtefunktion} (\enterm{probability
``pdf'', oder kurz ``density'') genannt. Die bekannteste density function}, \enterm[pdf|see{probability density
Wahrscheinlichkeitsdichtefunktion ist die der Normalverteilung function}]{pdf}, oder kurz \enterm[density|see{probability density
function}]{density}) genannt. Die bekannteste
Wahrscheinlichkeitsdichtefunktion ist die der \determ{Normalverteilung}
\[ p_g(x) = \[ p_g(x) =
\frac{1}{\sqrt{2\pi\sigma^2}}e^{-\frac{(x-\mu)^2}{2\sigma^2}} \] \frac{1}{\sqrt{2\pi\sigma^2}}e^{-\frac{(x-\mu)^2}{2\sigma^2}} \]
--- die Gau{\ss}sche-Glockenkurve mit Mittelwert $\mu$ und --- die \determ{Gau{\ss}sche-Glockenkurve} mit Mittelwert $\mu$ und
Standardabweichung $\sigma$. Standardabweichung $\sigma$.
\newpage
\begin{exercise}{gaussianpdf.m}{gaussianpdf.out} \begin{exercise}{gaussianpdf.m}{gaussianpdf.out}
\vspace{-3ex}
\begin{enumerate} \begin{enumerate}
\item Plotte die Wahrscheinlichkeitsdichte der Normalverteilung $p_g(x)$. \item Plotte die Wahrscheinlichkeitsdichte der Normalverteilung $p_g(x)$.
\item Berechne f\"ur die Normalverteilung mit Mittelwert Null und \item Berechne f\"ur die Normalverteilung mit Mittelwert Null und
@ -217,13 +218,13 @@ Standardabweichung $\sigma$.
\begin{figure}[t] \begin{figure}[t]
\includegraphics[width=1\textwidth]{pdfhistogram} \includegraphics[width=1\textwidth]{pdfhistogram}
\titlecaption{\label{pdfhistogramfig} Histogramme mit verschiednenen \titlecaption{\label{pdfhistogramfig} Histogramme mit verschiedenen
Klassenbreiten von normalverteilten Messwerten.}{Links: Die H\"ohe Klassenbreiten von normalverteilten Messwerten.}{Links: Die H\"ohe
des absoluten Histogramms h\"angt von der Klassenbreite des absoluten Histogramms h\"angt von der Klassenbreite
ab. Rechts: Bei auf das Integral normierten Histogrammen werden ab. Rechts: Bei auf das Integral normierten Histogrammen werden
auch unterschiedliche Klassenbreiten untereinander vergleichbar auch unterschiedliche Klassenbreiten untereinander vergleichbar
und auch mit der theoretischen Wahrschinlichkeitsdichtefunktion und auch mit der theoretischen Wahrschinlichkeitsdichtefunktion
(blau).}} (blau).}
\end{figure} \end{figure}
\begin{exercise}{gaussianbins.m}{} \begin{exercise}{gaussianbins.m}{}
@ -233,6 +234,7 @@ Standardabweichung $\sigma$.
unterschiedlichen Klassenbreiten. Was f\"allt auf?} unterschiedlichen Klassenbreiten. Was f\"allt auf?}
\end{exercise} \end{exercise}
\pagebreak[2]
Damit Histogramme von reellen Messwerten trotz unterschiedlicher Damit Histogramme von reellen Messwerten trotz unterschiedlicher
Anzahl von Messungen und unterschiedlicher Klassenbreiten Anzahl von Messungen und unterschiedlicher Klassenbreiten
untereinander vergleichbar werden und mit bekannten untereinander vergleichbar werden und mit bekannten
@ -251,6 +253,7 @@ und das normierte Histogramm hat die H\"ohe
Es muss also nicht nur durch die Summe, sondern auch durch die Breite Es muss also nicht nur durch die Summe, sondern auch durch die Breite
$\Delta x$ der Klassen geteilt werden (\figref{pdfhistogramfig}). $\Delta x$ der Klassen geteilt werden (\figref{pdfhistogramfig}).
\pagebreak[4]
\begin{exercise}{gaussianbinsnorm.m}{} \begin{exercise}{gaussianbinsnorm.m}{}
Normiere das Histogramm der vorherigen \"Ubung zu einer Wahrscheinlichkeitsdichte. Normiere das Histogramm der vorherigen \"Ubung zu einer Wahrscheinlichkeitsdichte.
\end{exercise} \end{exercise}
@ -266,13 +269,13 @@ $\Delta x$ der Klassen geteilt werden (\figref{pdfhistogramfig}).
Bisher haben wir Eigenschaften einer einzelnen Me{\ss}gr\"o{\ss}e Bisher haben wir Eigenschaften einer einzelnen Me{\ss}gr\"o{\ss}e
angeschaut. Bei mehreren Me{\ss}gr\"o{\ss}en, kann nach angeschaut. Bei mehreren Me{\ss}gr\"o{\ss}en, kann nach
Abh\"angigkeiten zwischen den beiden Gr\"o{\ss}en gefragt werden. Der Abh\"angigkeiten zwischen den beiden Gr\"o{\ss}en gefragt werden. Der
Korrelations\-koeffizient \determ[Korrelationskoeffizient]{Korrelations\-koeffizient}
\[ r_{x,y} = \frac{Cov(x,y)}{\sigma_x \sigma_y} = \frac{\langle \[ r_{x,y} = \frac{Cov(x,y)}{\sigma_x \sigma_y} = \frac{\langle
(x-\langle x \rangle)(y-\langle y \rangle) \rangle}{\sqrt{\langle (x-\langle x \rangle)(y-\langle y \rangle) \rangle}{\sqrt{\langle
(x-\langle x \rangle)^2} \rangle \sqrt{\langle (y-\langle y (x-\langle x \rangle)^2} \rangle \sqrt{\langle (y-\langle y
\rangle)^2} \rangle} \] \rangle)^2} \rangle} \]
quantifiziert einfache lineare Zusammenh\"ange \matlabfun{corr}. Der quantifiziert einfache lineare Zusammenh\"ange \matlabfun{corr()}. Der
Korrelationskoeffizient ist die Covarianz normiert durch die Korrelationskoeffizient ist die \determ{Kovarianz} normiert durch die
Standardabweichungen. Perfekt korrelierte Variablen ergeben einen Standardabweichungen. Perfekt korrelierte Variablen ergeben einen
Korrelationskoeffizienten von $+1$, antikorrelierte Daten einen Korrelationskoeffizienten von $+1$, antikorrelierte Daten einen
Korrelationskoeffizienten von $-1$ und nicht korrelierte Daten einen Korrelationskoeffizienten von $-1$ und nicht korrelierte Daten einen
@ -283,7 +286,7 @@ nur unzureichend oder \"uberhaupt nicht erfasst (\figref{nonlincorrelationfig}).
\begin{figure}[tp] \begin{figure}[tp]
\includegraphics[width=1\textwidth]{nonlincorrelation} \includegraphics[width=1\textwidth]{nonlincorrelation}
\titlecaption{\label{nonlincorrelationfig} Korrelationen von \titlecaption{\label{nonlincorrelationfig} Korrelationen bei
nichtlineare Zusammenh\"angen.}{Der Korrelationskoeffizienten nichtlineare Zusammenh\"angen.}{Der Korrelationskoeffizienten
erfasst nur lineare Zusammenh\"ange. Sowohl die quadratische erfasst nur lineare Zusammenh\"ange. Sowohl die quadratische
Abh\"angigkeit (links) als auch eine Rauschkorrelation (rechts), Abh\"angigkeit (links) als auch eine Rauschkorrelation (rechts),