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
SUBTEXS=$(foreach subd, $(SUBDIRS), $(subd)/lecture/$(subd).tex)
pdf : chapters $(BASENAME).pdf
all : script 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)
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 :
pdflatex -interaction=scrollmode $(BASENAME).tex
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 :
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
cleanall : clean
rm -f $(PDFFILE)
watchpdf :
while true; do ! make -q pdf && make pdf; sleep 0.5; done
rm -f $(BASENAME).pdf
for sd in $(SUBDIRS); do $(MAKE) -C $$sd/lecture cleanall; done

View File

@ -1,32 +1,13 @@
BASENAME=bootstrap
PYFILES=$(wildcard *.py)
PYPDFFILES=$(PYFILES:.py=.pdf)
all : pdf
# script:
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
include ../../chapter.mk
$(PYPDFFILES) : %.pdf : %.py
python $<
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
# script:
pdf : chapter
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}
\graphicspath{{figures/}}
\setcounter{page}{81}
\setcounter{chapter}{4}
\typein[\pagenumber]{Number of first page}
\typein[\chapternumber]{Chapter number}
\setcounter{page}{\pagenumber}
\setcounter{chapter}{\chapternumber}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -14,4 +16,10 @@
\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}

View File

@ -2,7 +2,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\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:
\begin{itemize}
\item Weniger Annahmen (z.B. muss eine Stichprobe nicht normalverteilt sein).
@ -21,21 +21,22 @@ aus der Stichprobe. Das hat mehrere Vorteile:
\end{figure}
Zur Erinnerung: In der Statistik interessieren wir uns f\"ur
Eigenschaften einer Grundgesamtheit. z.B. die mittlere L\"ange von
sauren Gurken (\figref{statisticalpopulationfig}). Aus der
Grundgesamtheit wird eine Stichprobe (simple random sample, SRS)
gezogen, da niemals die gesamte Grundgesamtheit gemessen werden kann.
Dann wird aus dieser einzigen Stichprobe die gew\"unschte Gr\"o{\ss}e
berechnet (die mittlere Gr\"o{\ss}e der sauren Gurken) und man hofft,
dass die erhaltene Zahl an der entsprechenden unbekannten Gr\"o{\ss}e
der Grundgesamtheit (der Populationsparameter) m\"oglichst nah dran
Eigenschaften einer \determ{Grundgesamtheit}. z.B. die mittlere
L\"ange von sauren Gurken (\figref{statisticalpopulationfig}). Aus der
Grundgesamtheit wird eine \determ{Stichprobe} (\enterm{simple random
sample}, \enterm[SRS|see{simple random sample}]{SRS}) gezogen, da
niemals die gesamte Grundgesamtheit gemessen werden kann. Dann wird
aus dieser einzigen Stichprobe die gew\"unschte Gr\"o{\ss}e berechnet
(die mittlere Gr\"o{\ss}e der sauren Gurken) und man hofft, dass die
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
Populationsparameter abgesch\"atzt worden ist.
Wenn wir viele Stichproben ziehen w\"urden, dann k\"onnte man f\"ur
jede Stichprobe den gew\"unschten Parameter berechnen, und von diesen
die Wahrscheinlichkeitsverteilung \"uber ein Histogramm bestimmen ---
die ``Stichprobenverteilung'' (sampling distribution,
die \determ{Stichprobenverteilung} (\enterm{sampling distribution},
\subfigref{bootstrapsamplingdistributionfig}{a}).
\begin{figure}[tp]
@ -43,7 +44,7 @@ die ``Stichprobenverteilung'' (sampling distribution,
\includegraphics[height=0.2\textheight]{srs2}\\[2ex]
\includegraphics[height=0.2\textheight]{srs3}
\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
Stichproben (SRS: simple random samples). Die Statistik (hier
Bestimmung von $\bar x$) kann f\"ur jede Stichprobe berechnet
@ -68,9 +69,9 @@ Mittelwerte der Stichproben um den Populationsmittelwert streuen
\subfigref{bootstrapsamplingdistributionfig}{b}).
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
Verteilung bestimmen (Bootstrap Verteilung,
Verteilung bestimmen (\determ{Bootstrapverteilung},
\subfigref{bootstrapsamplingdistributionfig}{c}). Diese Verteilung ist
interessanterweise in ihrer Breite und Form der Stichprobenverteilung
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
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
der gemessene Mittelwert um den Populationsmittelwert streut.
@ -115,6 +116,7 @@ eine ganze Verteilung von Mittelwerten generieren
(\figref{bootstrapsemfig}). Die Standardabweichung dieser Verteilung
ist dann der gesuchte Standardfehler des Mittelwerts.
\pagebreak[4]
\begin{exercise}{bootstrapsem.m}{bootstrapsem.out}
Erzeuge die Verteilung der Mittelwerte einer Stichprobe durch Bottstrapping,
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
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
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
Korrelationen veranschaulichen. Gegeben sind Datenpaare $(x_i, y_i)$.
Daraus k\"onnen wir den Korrelationskoeffizienten berechnen. Wir
wissen dann aber noch nicht, ob der berechnete Wert tats\"achlich eine
Korrelation anzeigt. Die Nullhypothese ist, dass die Daten nicht
miteinander korreliert sind. Indem wir die $x$-Werte und die $y$-Werte
unabh\"angig voneinander permutieren (ihre Reihenfolge zuf\"allig neu
anordnen), werden die Korrelationen der Datenpaare zerst\"ort. Wenn
wir das viele Male wiederholen, bekommen wir die Verteilung der
Korrelationskoeffizienten f\"ur nichtkorrelierte Daten. Aus dieser
Verteilung der Nullhypothese k\"onnen wir dann dann die Signifikanz
der tats\"achlich gemessenen Korrelation bestimmen.
Daraus k\"onnen wir den
\determ[Korrelationskoeffizient]{Korrelationskoeffizienten}
berechnen. Wir wissen dann aber noch nicht, ob der berechnete Wert
tats\"achlich eine Korrelation anzeigt. Die Nullhypothese ist, dass
die Daten nicht miteinander korreliert sind. Indem wir die $x$-Werte
und die $y$-Werte unabh\"angig voneinander permutieren (ihre
Reihenfolge zuf\"allig neu anordnen), werden die Korrelationen der
Datenpaare zerst\"ort. Wenn wir das viele Male wiederholen, bekommen
wir die Verteilung der Korrelationskoeffizienten f\"ur
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}
Bestimme die Signifikanz eines Korrelationskoeffizienten.
@ -186,7 +190,7 @@ Bestimme die Signifikanz eines Korrelationskoeffizienten.
\item Berechne den Korrelationskoeffizient dieser Datenpaare.
\item Generiere die Verteilung der Nullhypothese ``unkorrelierte
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.
\item Bestimme aus den Nullhypothesendaten das 95\,\%-Perzentil und
vergleiche es mit dem tats\"achlichen Korrelationskoeffizienten.

View File

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

View File

@ -2,7 +2,7 @@ import numpy as np
import matplotlib.pyplot as plt
plt.xkcd()
fig = plt.figure( figsize=(6,4) )
fig = plt.figure( figsize=(6,3.5) )
rng = np.random.RandomState(637281)
# 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
PYFILES=$(wildcard *.py)
PYPDFFILES=$(PYFILES:.py=.pdf)
all : pdf
# script:
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
include ../../chapter.mk
$(PYPDFFILES) : %.pdf : %.py
python $<
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
# script:
pdf : chapter
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}
\graphicspath{{figures/}}
\setcounter{page}{125}
\setcounter{chapter}{8}
\typein[\pagenumber]{Number of first page}
\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}
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
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.
@ -24,7 +24,7 @@ end
Wenn in der Schleife das Ergebnis in einen Vektor gespeichert werden soll,
sollten wir vor der Schleife schon einen Vektor f\"ur die Ergebnisse
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
y = zeros(length(x),1); % Platz fuer die Ergebnisse, genauso viele wie Loops der Schleife
for i=1:length(x)
@ -39,7 +39,7 @@ mean(y)
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
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
y = zeros(length(x),10); % Platz fuer die Ergebnisse
for i=1:length(x)
@ -54,7 +54,7 @@ mean(y, 1)
Alternativ k\"onnen die in der Schleife erzeugten Vektoren zu einem
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
y = []; % Leerer Vektor fuer die Ergebnisse
for i=1:length(x)
@ -75,7 +75,6 @@ Zufallsgeneratoren geben oft nur Zufallszahlen mit festen Mittelwerten
und Standardabweichungen (auch Skalierungen) zur\"uck. Multiplikation
mit einem Faktor skaliert die Standardabweichung und Addition einer Zahl
verschiebt den Mittelwert.
\begin{lstlisting}[caption={Skalierung von Zufallszahlen}]
% 100 random numbers draw from a Gaussian distribution with mean 0 and standard deviation 1.
x = randn(100, 1);
@ -85,9 +84,8 @@ mu = 4.8;
sigma = 2.3;
y = randn(100, 1)*sigma + mu;
\end{lstlisting}
Das gleiche Prinzip ist manchmal auch sinnvoll f\"ur \code{zeros} oder \code{ones}:
\begin{lstlisting}[caption={Skalierung von zeros und 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()}}]
x = -1:0.01:2; % Vektor mit x-Werten
plot(x, exp(-x.*x));
% 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
Wahrscheinlichkeitsverteilungen werden.
Die \code{histogram} Funktion macht das mit den entsprechenden Parametern automatisch:
\begin{lstlisting}[caption={Probability-density-function mit der histogram-Funktion}]
Die \code{histogram()} Funktion macht das mit den entsprechenden Parametern automatisch:
\begin{lstlisting}[caption={Probability-density-function mit der \varcode{histogram()}-Funktion}]
x = randn(100, 1); % irgendwelche reellwertige Daten
histogram(x, 'Normalization', 'pdf');
\end{lstlisting}
\begin{lstlisting}[caption={Probability mit der histogram-Funktion}]
\begin{lstlisting}[caption={Probability mit der \varcode{histogram()}-Funktion}]
x = randi(6, 100, 1); % irgendwelche integer Daten
histogram(x, 'Normalization', 'probability');
\end{lstlisting}
So geht es aber auch:
\begin{lstlisting}[caption={Probability-density-function mit der hist- und bar-Funktion}]
So geht es mit der \code{hist()}-Funktion:
\begin{lstlisting}[caption={Probability-density-function mit der \varcode{hist()}- und \varcode{bar()}-Funktion}]
x = randn(100, 1); % irgendwelche reellwertige Daten
[h, b] = hist(x); % Histogram berechnen
h = h/sum(h)/(b(2)-b(1)); % normieren zu einer Wahrscheinlichkeitsdichte
bar(b, h); % und plotten.
\end{lstlisting}
\begin{lstlisting}[caption={Probability mit der hist- und bar-Funktion}]
\begin{lstlisting}[caption={Probability mit der \varcode{hist()}- und \varcode{bar()}-Funktion}]
x = randi(6, 100, 1); % irgendwelche integer Daten
[h, b] = hist(x); % Histogram berechnen
h = h/sum(h); % normieren zu Wahrscheinlichkeiten

View File

@ -26,8 +26,10 @@
%%%%% index %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage[makeindex]{splitidx}
\makeindex
\usepackage[totoc]{idxlayout}
\newindex[Fachbegriffe]{term}
\newindex[Code]{code}
\newindex[Englische Fachbegriffe]{enterm}
\newindex[MATLAB Code]{code}
%%%%% units %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage[mediumspace,mediumqspace,Gray]{SIunits} % \ohm, \micro
@ -66,9 +68,9 @@
% float placement fractions:
\renewcommand{\textfraction}{0.2}
\renewcommand{\topfraction}{0.8}
\renewcommand{\topfraction}{0.9}
\renewcommand{\bottomfraction}{0.0}
\renewcommand{\floatpagefraction}{0.5}
\renewcommand{\floatpagefraction}{0.7}
% spacing for floats:
\setlength{\floatsep}{12pt plus 2pt minus 2pt}
@ -138,6 +140,11 @@
\newcommand{\tabrefb}[1]{\tabb~\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 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%\newcommand{\eqref}[1]{(\ref{#1})}
\newcommand{\eqn}{\tr{Eq}{Gl}.}
@ -166,7 +173,7 @@
frame=single,
caption={\protect\filename@parse{\lstname}\protect\filename@base},
captionpos=t,
xleftmargin=2.5em,
xleftmargin=21pt,
xrightmargin=1mm,
aboveskip=1ex,
belowskip=2ex
@ -189,11 +196,15 @@
\newcommand{\koZ}{\mathds{C}}
%%%%% english, german, code and file terms: %%%%%%%%%%%%%%%
\newcommand{\enterm}[1]{``#1''\sindex[term]{#1}}
\newcommand{\determ}[1]{\textit{#1}\sindex[term]{#1}}
\newcommand{\codeterm}[1]{\textit{#1}\sindex[term]{#1}}
\usepackage{ifthen}
\newcommand{\enterm}[2][]{``#2''\ifthenelse{\equal{#1}{}}{\protect\sindex[enterm]{#2}}{\protect\sindex[enterm]{#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}}
% for escaping special characters into the index:
\newcommand{\scor}{"|}
%%%%% key-shortcuts %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage{tikz}
\usetikzlibrary{shapes}
@ -202,9 +213,17 @@
%%%%% code/matlab commands: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage{textcomp}
\newcommand{\code}[1]{\setlength{\fboxsep}{0.5ex}\colorbox{codeback}{\texttt{#1}}\sindex[code]{#1}}
\newcommand{\matlab}{MATLAB$^{\copyright}$}
\newcommand{\matlabfun}[1]{(\tr{\matlab{}-function}{\matlab-Funktion} \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{\code}[2][]{\varcode{#2}\ifthenelse{\equal{#1}{}}{\protect\sindex[code]{#2}}{\protect\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: %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% usage:
@ -223,7 +242,6 @@
% content of someoutput.out
%
% Innerhalb der exercise Umgebung ist enumerate umdefiniert, um (a), (b), (c), .. zu erzeugen.
\usepackage{ifthen}
\usepackage{mdframed}
\usepackage{xstring}
\newcommand{\codepath}{}
@ -241,18 +259,20 @@
\newcommand{\exerciseoutput}{#2}%
\setlength{\fboxsep}{2mm}%
\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]%
\captionof{exercisef}[\exercisefile]{}%
\captionsetup{font={normal,sf,it}}%
}%
{\ifthenelse{\equal{\exercisesource}{}}{}%
{\ifthenelse{\value{exercise}>\value{maxexercise}}{}%
{\hypersetup{hypertexnames=false}%
\ifthenelse{\equal{\exercisesource}{}}{}%
{\ifthenelse{\value{exercisef}>\value{maxexercise}}{}%
{\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}{}}{}%
{\addtocounter{lstlisting}{-1}%
\lstinputlisting[language={},title={\textbf{\tr{Output}{Ausgabe}:}},nolol=true,belowskip=0pt]{\codepath\exerciseoutput}}}}%
\hypersetup{hypertexnames=true}%
\end{mdframed}%
\renewcommand{\theenumi}{\saveenumi}}
@ -277,11 +297,13 @@
\newenvironment{ibox}[2][tp]
{\SetupFloatingEnvironment{iboxf}{placement=#1}%
\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,%
backgroundcolor=infoback,font={\sffamily},%
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{iboxf}}
@ -303,14 +325,16 @@
% placement=t
% ]{importantf}
\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}{}}%
{\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,%
backgroundcolor=importantback,font={\sffamily},%
frametitle={\captionof{iboxf}{#1}},frametitleaboveskip=-1ex,%
frametitlebackgroundcolor=importantline]}%
frametitlebackgroundcolor=importantline]%
\setlength{\parindent}{0pt}\setlength{\parskip}{1ex}}%
}%
{\end{mdframed}}
@ -318,5 +342,6 @@
%%%%% hyperref %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\usepackage[bookmarks=true,bookmarksopen=true,%
pdfpagemode=UseNone,pdfstartview=FitH,%
plainpages=false,pdfpagelabels,%
breaklinks=true,colorlinks=true,%
citecolor=blue!50!black,linkcolor=red!70!black,urlcolor=blue!50!black]{hyperref}

View File

@ -1,32 +1,12 @@
BASENAME=likelihood
PYFILES=$(wildcard *.py)
PYPDFFILES=$(PYFILES:.py=.pdf)
all : pdf
# script:
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 $<
include ../../chapter.mk
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 :
while true; do ! make -q pdf && make pdf; sleep 0.5; done
# script:
pdf : chapter
clean : cleanchapter
cleanall : clean cleanchapter

View File

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

View File

@ -7,7 +7,8 @@
In vielen Situationen wollen wir einen oder mehrere Parameter $\theta$
einer Wahrscheinlichkeitsverteilung sch\"atzen, so dass die Verteilung
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
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)
\ldots p(x_n|\theta) = \prod_{i=1}^n p(x_i|\theta) \; .
\end{equation}
Andersherum gesehen ist das die Likelihood (deutsch immer noch ``Wahrscheinlichleit'')
den Parameter $\theta$ zu haben, gegeben die Me{\ss}werte $x_1, x_2, \ldots x_n$,
Andersherum gesehen ist das die \determ{Likelihood}
(\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}
{\cal L}(\theta|x_1,x_2, \ldots x_n) = p(x_1,x_2, \ldots x_n|\theta)
\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
transformiert. Aus numerischen und gleich ersichtlichen mathematischen
Gr\"unden wird meistens das Maximum der logarithmierten Likelihood
(``Log-Likelihood'') gesucht:
(\determ{log-Likelihood}, \enterm{log-likelihood}) gesucht:
\begin{eqnarray}
\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 \\
@ -73,7 +76,7 @@ $\theta$ maximiert dessen Likelhood?
\begin{figure}[t]
\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
Normalverteilungen mit unterschiedlichen Mittelwerten (Pfeile) aus
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
die Position der Maxima mit dem aus den Daten berechneten
Mittelwert.
\newpage
\pagebreak[4]
\end{exercise}
\pagebreak[4]
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\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$ gefittet werden. Wenn wir annehmen, dass die $y_i$ um die
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 \]
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 \]
\matlabfun{polyfit}.
\matlabfun{polyfit()}.
Parameter, die nichtlinear in einer Funktion enthalten sind, k\"onnen
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 \; . \]
F\"ur diesen Fall bleibt dann nur auf numerische Verfahren zur
Optimierung der Kostenfunktion, wie z.B. der Gradientenabstieg,
zur\"uckzugreifen \matlabfun{lsqcurvefit}.
zur\"uckzugreifen \matlabfun{lsqcurvefit()}.
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\section{Fits von Wahrscheinlichkeitsverteilungen}
Jetzt betrachten wir noch den Fall, bei dem wir die 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
Wahrscheinlichkeitsdichtefunktion durch Minimierung des quadratischen
Abstands an ein Histogramm der Daten zu fitten. Das ist aber aus
folgenden Gr\"unden nicht die Methode der Wahl: (i)
Wahrscheinlichkeitsdichten k\"onnen nur positiv sein. Darum k\"onnen
insbesondere bei kleinen Werten die Daten nicht symmetrisch streuen,
wie es bei normalverteilten Daten der Fall ist. (ii) Die Datenwerte
sind nicht unabh\"angig, da das normierte Histogram sich zu Eins
aufintegriert. Die beiden Annahmen normalverteilte und unabh\"angige
Daten, die die Minimierung des quadratischen Abstands
\eqnref{chisqmin} zu einem Maximum-Likelihood Sch\"atzer machen, sind
also verletzt. (iii) Das Histogramm h\"angt von der Wahl der
Klassenbreite ab (\figref{mlepdffig}).
\determ[Wahrscheinlichkeitsdichte]{Wahrscheinlichkeitsdichtefunktion}
durch Minimierung des quadratischen Abstands an ein Histogramm der
Daten zu fitten. Das ist aber aus folgenden Gr\"unden nicht die
Methode der Wahl: (i) Wahrscheinlichkeitsdichten k\"onnen nur positiv
sein. Darum k\"onnen insbesondere bei kleinen Werten die Daten nicht
symmetrisch streuen, wie es bei normalverteilten Daten der Fall
ist. (ii) Die Datenwerte sind nicht unabh\"angig, da das normierte
Histogram sich zu Eins aufintegriert. Die beiden Annahmen
normalverteilte und unabh\"angige Daten, die die Minimierung des
quadratischen Abstands \eqnref{chisqmin} zu einem Maximum-Likelihood
Sch\"atzer machen, sind also verletzt. (iii) Das Histogramm h\"angt
von der Wahl der Klassenbreite ab (\figref{mlepdffig}).
\begin{figure}[t]
\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
\eqnref{loglikelihood} maximal wird. Das ist im allgemeinen ein
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}
Erzeuge Gammaverteilte Zufallszahlen und benutze Maximum-Likelihood,
um die Parameter der Gammafunktion aus den Daten zu bestimmen.
\newpage
\pagebreak
\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
Antwort der Neurone f\"ur verschiedene Stimuli (z.B. verschiedene
Orientierungen des Balkens) gemessen. Die mittlere Antwort der Neurone
als Funktion eines Stimulusparameters ist dann die ``Tuning-curve''
(z.B. Feuerrate als Funktion des Orientierungswinkels).
als Funktion eines Stimulusparameters ist dann die
\enterm{Tuning-curve} (deutsch \determ{Abstimmkurve}, z.B. Feuerrate
als Funktion des Orientierungswinkels).
\begin{figure}[tp]
\includegraphics[width=1\textwidth]{mlecoding}

View File

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

View File

@ -1,15 +1,11 @@
clear all
close all
load('pyramidal_response.mat')
threshold = 20; % mV
figure()
hold on
plot(time*1000.0, neuronal_data, 'color', [0.2 0.5 0.7], 'linewidth', 1., ...
'displayname', 'Membrane voltage')
plot(spikes*1000.0, ones(size(spikes)) .* threshold, 'r.', 'markersize', 15, ...
'displayname', 'Spike times')
plot(time*1000.0, neuronal_data, 'color', [0.2 0.5 0.7], ...
'linewidth', 1., 'displayname', 'Membrane voltage')
plot(spikes*1000.0, ones(size(spikes)) .* threshold, 'r.', ...
'markersize', 15, 'displayname', 'Spike times')
line([time(1) time(end)], [threshold threshold], 'linestyle', '--', ...
'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, 'tickdir','out', 'linewidth', 1.5, 'fontname', 'times', ...
'fontsize', 11)
set(gcf, 'paperunits', 'centimeters', 'papersize', [15 7.5]);
set(gcf, 'paperposition',[0.0 0.0 15, 7.5], 'color', 'white')
set(gcf, 'paperunits', 'centimeters', 'papersize', [15 7]);
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
PYFILES=$(wildcard *.py)
PYPDFFILES=$(PYFILES:.py=.pdf)
GPTFILES=$(wildcard *.gpt)
GPTTEXFILES=$(GPTFILES:.gpt=.tex)
all: pdf slides thumbs
include ../../chapter.mk
# script:
pdf : $(BASENAME)-chapter.pdf
$(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
pdf : chapter
# 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
rm thumbsfoils.*
watchpdf :
while true; do ! make -q pdf && make pdf; sleep 0.5; done
watchslides :
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 :
rm -f *~
rm -f $(BASENAME).aux $(BASENAME).log
rm -f $(BASENAME)-chapter.aux $(BASENAME)-chapter.log $(BASENAME)-chapter.out
clean : cleanchapter
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
rm -f $(BASENAME)-chapter.pdf $(BASENAME)-slides.pdf $(BASENAME)-handout.pdf
cleanall : clean cleanallchapter
rm -f $(BASENAME)-slides.pdf $(BASENAME)-handout.pdf
help :

View File

@ -5,8 +5,10 @@
\lstset{inputpath=../code}
\graphicspath{{images/}}
\setcounter{page}{45}
\setcounter{chapter}{1}
\typein[\pagenumber]{Number of first page}
\typein[\chapternumber]{Chapter number}
\setcounter{page}{\pagenumber}
\setcounter{chapter}{\chapternumber}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -14,5 +16,13 @@
\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}

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
darf durchaus zu den notwendigen Kernkompetenzen gez\"ahlt werden. Wir
@ -34,13 +34,13 @@ Zwecken genutzt wird.
Ein Datenplot muss ausreichend beschriftet werden:
\begin{itemize}
\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
diese mit einer Legende oder \"ahnlichem benannt werden
\matlabfun{legend()}.
\item Mehrere Plots mit den gleichen Gr\"o{\ss}en auf den Achsen,
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
Abbildungsunterschrift erw\"ahnt werden.
\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{}}
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
Achsbeschriftungen, Legenden, etc. Es gibt zwei M\"oglichkeiten diese
hinzuzuf\"ugen: (i) das Graphische User Interface oder (ii) die
Kommandozeile. Beide haben ihre Berechtigung sowie Vor- und
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
(\figref{ploteditorfig}) zu bearbeiten sind die erhaltenen Ergebnisse
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:
\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.
\item \enterm{Axes}: Das Koordinatensystem in welches gezeichnet wird.
\item \enterm{Lines}: Die gezeichneten Datenplots wie Linien,
\item \enterm[axes]{Axes}: Das Koordinatensystem in welches gezeichnet wird.
\item \enterm[lines]{Lines}: Die gezeichneten Datenplots wie Linien,
Fl\"achen, etc.
\item \enterm{Annotations}: Annotationen wie Textboxen oder auch
Pfeile, die zum Hervorheben von Punkten, oder Abschnitten gedacht
sind.
\item \enterm{Legends}: Legenden der Datenplots.
\item \enterm[annotations]{Annotations}: Annotationen wie Textboxen
oder auch Pfeile, die zum Hervorheben von Punkten, oder Abschnitten
gedacht sind.
\item \enterm[legends]{Legends}: Legenden der Datenplots.
\end{enumerate}
Jedes dieser Elemente bietet eine Vielzahl von
Einstellungsm\"oglichkeiten. Wie schon erw\"ahnt, k\"onnen diese
\"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
werden k\"onnen, sind auch \"uber Befehle auf der Kommandozeile
m\"oglich. Auf diese Weise k\"onnen Einstellungen problemlos in ein
@ -212,9 +212,9 @@ Datens\"atzen erstellt werden soll.
\subsection{Einfaches Plotten}
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
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
und stellt die Daten als Linienplot dar. Dabei werden die Datenpunkte
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()}
Befehl aufgerufen wird.
Im obigen Plot Aufruf wird nur ein Argument, das \code{y}, an die
Funktion \code{plot} \"ubergeben. \code{plot} erh\"alt nur die
Im obigen Plot Aufruf wird nur ein Argument, das \varcode{y}, an die
Funktion \code{plot()} \"ubergeben. \code{plot()} erh\"alt nur die
y-Werte. \matlab{} substituiert in diesem Fall die fehlenden x-Werte,
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,
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
durchgezogener Linie, ohne Marker und der Strichst\"arke 1
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.
\begin{table}[tp]
\titlecaption{Vordefinierte Linienstile (links), Farben (Mitte) und Markersymbole (rechts).}{}\label{plotlinestyles}
\begin{minipage}[t]{0.3\textwidth}
\vspace{0pt}
\begin{tabular}{lc} \hline
\textbf{Linienstil} & \textbf{K\"urzel} \\\hline
durchgezogen & '\verb|-|' \\
gestrichelt & '\verb|--|' \\
gepunktet & '\verb|:|' \\
Strichpunkte & '\verb|.-|' \\\hline
\end{tabular}
\end{minipage}
\vspace{0pt}
\begin{minipage}[t]{.3\textwidth}
\vspace{0pt}
\hspace{0.05\textwidth}
\begin{tabular}{lc} \hline
\textbf{Farbe} & \textbf{K\"urzel} \\ \hline
Rot & 'r'\\
Gr\"un & 'g' \\
Blau & 'b' \\
Cyan & 'c' \\
Magenta & 'm' \\
Gelb & 'y' \\
Schwarz & 'k' \\ \hline
\end{tabular}
\end{minipage}
\vspace{0pt}
\begin{minipage}[t]{0.3\textwidth}
\vspace{0pt}
\begin{tabular}{lc} \hline
\textbf{Markersymbol} & \textbf{K\"urzel} \\ \hline
Kreis & 'o'\\
Stern & '*' \\
Plus & '+' \\
Kreuz & 'x' \\
Diamant & 'd' \\
Pentagramm & 'p' \\
Hexagramm & 'h' \\
Quadrat & 's' \\
Dreieck & '\^{}' \\
Umgekehrtes Dreieck & 'v' \\
Dreieck links & '$<$'\\
Dreieck rechts & '$>$'\\\hline
\end{tabular}
\end{minipage}
\titlecaption{Vordefinierte Linienstile (links), Farben (Mitte) und Markersymbole (rechts).}{}\label{plotlinestyles}
\begin{tabular}[t]{lc} \hline
\textbf{Linienstil} & \textbf{K\"urzel} \erh \\\hline
durchgezogen & '\verb|-|' \erb \\
gestrichelt & '\verb|--|' \\
gepunktet & '\verb|:|' \\
Strichpunkte & '\verb|.-|' \\\hline
\end{tabular}
\hfill
\begin{tabular}[t]{lc} \hline
\textbf{Farbe} & \textbf{K\"urzel} \erh \\ \hline
Rot & 'r' \erb \\
Gr\"un & 'g' \\
Blau & 'b' \\
Cyan & 'c' \\
Magenta & 'm' \\
Gelb & 'y' \\
Schwarz & 'k' \\ \hline
\end{tabular}
\hfill
\begin{tabular}[t]{lc} \hline
\textbf{Markersymbol} & \textbf{K\"urzel} \erh \\ \hline
Kreis & 'o' \erb \\
Stern & '*' \\
Plus & '+' \\
Kreuz & 'x' \\
Diamant & 'd' \\
Pentagramm & 'p' \\
Hexagramm & 'h' \\
Quadrat & 's' \\
Dreieck & '\^{}' \\
Umgekehrtes Dreieck & 'v' \\
Dreieck links & '$<$'\\
Dreieck rechts & '$>$'\\\hline
\end{tabular}
\end{table}
\subsection{Ver\"andern von Linieneigenschaften}
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
Linie der St\"arke 1.5 und Sternmarkern an den Positionen der
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.
\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;
y = sin(x);
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}
Das erste, was ein Plot zus\"atzlich braucht, ist eine
Achsenbeschriftung. Mithilfe der Funktionen \code{xlabel('Time [ms]')}
und \code{ylabel('Voltage [V]')} k\"onnen diese gesetzt
Achsenbeschriftung. Mithilfe der Funktionen \code[xlabel()]{xlabel('Time [ms]')}
und \code[ylabel()]{ylabel('Voltage [V]')} k\"onnen diese gesetzt
werden.
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
ganzzahligen Wert aufgerundet. Mit den Funktionen \code{xlim} und
\code{ylim} k\"onnen die Grenezen der Achsen aber auch manuell
eingestellt werden. Die Funktionen \code{xlim} und \code{ylim}
ganzzahligen Wert aufgerundet. Mit den Funktionen \code{xlim()} und
\code{ylim()} k\"onnen die Grenezen der Achsen aber auch manuell
eingestellt werden. Die Funktionen \code{xlim()} und \code{ylim()}
erwarten als Argument einen 2-elementigen Vektor mit dem Minimum und
dem Maximum der jeweiligen Achse. Tabelle \ref{plotaxisprops} listet
weitere h\"aufig genutzte Einstellungen der Achsen. Mit der \code{set}
- Funktion k\"onnen diese ver\"andert werden wie in Zeile 15 in
Listing \ref{niceplotlisting} gezeigt. Die \code{set} - Funktion
erwartet als erstes Argument ein sogenanntes Handle der Achse, dieses
wird gefolgt von einer beliebig langen Reihe von Eigenschaft-Wert
Paaren. Soll z.B. das Gitternetz der x-Achse gezeigt werden, wird die
Eigenschaft \codeterm{XGrid} auf den Wert \codeterm{'on'} gesetzt:
\code{set(gca, 'XGrid', 'on');}. Das erste Argument ist ein Aufruf der
Funktion \code{gca}, ``get-current-axis'' und ist das Achsenhandle der
gerade aktiven Achse.
weitere h\"aufig genutzte Einstellungen der Achsen. Mit der
\code{set()} - Funktion k\"onnen diese ver\"andert werden wie in Zeile
15 in Listing \ref{niceplotlisting} gezeigt. Die \code{set()} -
Funktion erwartet als erstes Argument ein sogenanntes Handle der
Achse, dieses wird gefolgt von einer beliebig langen Reihe von
Eigenschaft-Wert Paaren. Soll z.B. das Gitternetz der x-Achse gezeigt
werden, wird die Eigenschaft \code{XGrid} auf den Wert
\varcode{'on'} gesetzt: \code[set()!set(gca, 'XGrid',
'on')]{set(gca, 'XGrid', 'on');}. Das erste Argument ist ein Aufruf
der Funktion \code{gca}, \enterm{get-current-axis} und ist das Achsenhandle
der gerade aktiven Achse.
\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}
\begin{tabular*}{1\textwidth}{lp{6.3cm}p{6cm}} \hline
\textbf{Eigenschaft} & \textbf{Beschreibung} & \textbf{Optionen} \\ \hline
\codeterm{Box} & Definiert, ob der Rahmen der Achse vollst\"andig gezeichnet wird. & $\{'on'|'off'\}$ \\
\codeterm{Color} & Hintergrundfarbe des Koordinatensystems. & Beliebige RGB, CMYK ... Werte. \\
\codeterm{Fontname} & Der Name der Schriftart. & Im System installierte Schriften. \\
\codeterm{FontSize} & Gr\"o{\ss}e der Schrift. & Skalarer Wert.\\
\codeterm{FontUnit} & Einheit, in der die Schriftgr\"o{\ss}e bestimmt wird. & $\{'points' | 'centimeters' | 'inches', ...\}$\\
\codeterm{FontWeight} & Fett- oder Normalsatz der Schrift. & $\{'normal' | 'bold'\}$\\
\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{5.8cm}p{5.5cm}} \hline
\textbf{Eigenschaft} & \textbf{Beschreibung} & \textbf{Optionen} \erh \\ \hline
\code{Box} & Definiert, ob der Rahmen der Achse vollst\"andig gezeichnet wird. & $\{'on'|'off'\}$ \erb \\
\code{Color} & Hintergrundfarbe des Koordinatensystems. & Beliebige RGB, CMYK Werte. \\
\code{Fontname} & Der Name der Schriftart. & Im System installierte Schriften. \\
\code{FontSize} & Gr\"o{\ss}e der Schrift. & Skalarer Wert.\\
\code{FontUnit} & Einheit, in der die Schriftgr\"o{\ss}e bestimmt wird. & $\{'points' | 'centimeters' | 'inches', ...\}$\\
\code{FontWeight} & Fett- oder Normalsatz der Schrift. & $\{'normal' | 'bold'\}$\\
% & 'd' \\ ??????
\codeterm{TickDir} & Richtung der Teilstriche auf der Achse. & $\{'in' | 'out'\}$\\
\codeterm{TickLength} & L\"ange der Haupt- und Nebenteilstriche & \\
\codeterm{X-, Y-, ZDir} & Richtung der Achsskalierung. & $\{'normal' | 'reversed'\}$\\
\codeterm{X-, Y-, ZGrid} & Sollen Gitternetzlinien gezeigt werden? & $\{'off'|'on'\}$ \\
\codeterm{X-, Y-, ZScale} & Lineare oder logarithmische Skalierung der Achse. & $\{'linear' | 'log'\}$\\
\codeterm{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{TickDir} & Richtung der Teilstriche auf der Achse. & $\{'in' | 'out'\}$\\
\code{TickLength} & L\"ange der Haupt- und Nebenteilstriche & \\
\code{X-, Y-, ZDir} & Richtung der Achsskalierung. & $\{'normal' | 'reversed'\}$\\
\code{X-, Y-, ZGrid} & Sollen Gitternetzlinien gezeigt werden? & $\{'off'|'on'\}$ \\
\code{X-, Y-, ZScale} & Lineare oder logarithmische Skalierung der Achse. & $\{'linear' | 'log'\}$\\
\code{X-, Y-, ZTick} & Position der Teilstriche auf der Achse. & Vektor mit Positionen.\\
\code{X-, Y-, ZTickLabel} & Beschriftung der Teilstriche. & Vektor mit entsprechenden Zahlen oder Cell-Array mit Strings.\\ \hline
\end{tabular*}
\end{table}
@ -354,19 +345,19 @@ gerade aktiven Achse.
\subsection{Ver\"andern von Figure-Einstellungen}
\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}
\begin{tabular*}{1\textwidth}{lp{6.3cm}p{6cm}} \hline
\textbf{Eigenschaft} & \textbf{Beschreibung} & \textbf{Optionen} \\ \hline
\codeterm{Color} & Hintergrundfarbe der Zeichenfl\"ache. & Beliebige RGB, CMYK ... Werte. \\
\codeterm{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.\\
\codeterm{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
\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.6cm}p{5.7cm}} \hline
\textbf{Eigenschaft} & \textbf{Beschreibung} & \textbf{Optionen} \erh \\ \hline
\code{Color} & Hintergrundfarbe der Zeichenfl\"ache. & Beliebige RGB, CMYK Werte. \erb \\
\code{PaperPosition} & Position der Abbildung auf dem Papier & 4-elementiger Vektor mit den Positionen der linken-unteren, und rechten-oberen Ecke. \\
\code{PaperSize} & Gr\"o{\ss}e der des Papiers. & 2-elementiger Vektor mit der Papiergr\"o{\ss}e.\\
\code{PaperUnits} & Einheit, in der die Papiergr\"o{\ss}e bestimmt wird. & $\{'inches' | 'centimeters' | 'normalized' | 'points'\}$\\
\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{table}
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
meistverwendeten). Das erste Argument f\"ur \code{set()} ist jetzt
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
Abbildung in Zentimetern definiert wird. In Zeile 16 wird die
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
Argument ist der Dateiname, und zuletzt muss das gew\"unschte Format
(Box \ref{graphicsformatbox}) angegeben werden.
\lstinputlisting[caption={Skript zur Erstellung des Plots in \figref{spikedetectionfig}.}, label=niceplotlisting]{automatic_plot.m}
\begin{figure}[t]
\includegraphics{spike_detection}
\titlecaption{Automatisch erstellter Plot.}{Dieser Plot wurde vollst\"andig
mit dem Skript in Listing \ref{niceplotlisting} erstellt und
gespeichert.}\label{spikedetectionfig}
\end{figure}
Neben den Standard-Linienplots gibt es eine ganze Reihe weiterer
M\"oglichkeiten Daten zu Visualisieren. Mathworks zeigt 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.}
Es gibt zwei grunds\"atzlich verschiedene Arten von Dateiformaten f\"ur
Graphiken:
@ -406,7 +389,6 @@ Homepage viele Beispiele mit zugeh\"origem Code
\item \determ{Rastergraphik} (\enterm{bitmap})
\item \determ{Vektorgraphik} (\enterm{vector graphics})
\end{enumerate}
Bei Rastergraphiken wird f\"ur jeden Bildpunkt (jedes Pixel) der
aktuelle Farbwert angegeben. Rastergraphiken haben eine bestimmte
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
ist die Skalierbakeit ohne Qualit\"atsverlust.
\vspace{1ex}
\begin{minipage}[t]{0.38\textwidth}
\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}
\end{minipage}
\hfill
\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|}
\hline
\textbf{Format} & \textbf{Typ} & \code{saveas} Argument \rule[-1.2ex]{0pt}{3.5ex} \\ \hline
pdf & Vektor & \codeterm{'pdf'} \rule{0pt}{2.5ex} \\
eps & Vektor & \codeterm{'eps', 'epsc'} \\
SVG & Vektor & \codeterm{'svg'} \\
PS & Vektor & \codeterm{'ps', 'psc'} \\
jpg & Bitmap & \codeterm{'jpeg'} \\
tif & Bitmap & \codeterm{'tiff', 'tiffn'} \\
png & Bitmap & \codeterm{'png'} \\
bmp & Bitmap & \codeterm{'bmp'} \\ \hline
\textbf{Format} & \textbf{Typ} & \code{saveas()} Argument \erh \\ \hline
pdf & Vektor & \varcode{'pdf'} \erb \\
eps & Vektor & \varcode{'eps'}, \varcode{'epsc'} \\
SVG & Vektor & \varcode{'svg'} \\
PS & Vektor & \varcode{'ps'}, \varcode{'psc'} \\
jpg & Bitmap & \varcode{'jpeg'} \\
tif & Bitmap & \varcode{'tiff'}, \varcode{'tiffn'} \\
png & Bitmap & \varcode{'png'} \\
bmp & Bitmap & \varcode{'bmp'} \\ \hline
\end{tabular}
\end{minipage}
\vspace{1ex}
Wenn aus \matlab{} heraus Graphiken gespeichert werden sollen, dann
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.
\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}

View File

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

View File

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

View File

@ -1,22 +1,24 @@
function [time, rate] = instantaneousRate(spike_times, dt, t_max)
% Function calculates the firing rate as the inverse of the interspike
% interval.
function [time, rate] = instantaneous_rate(spikes, dt, t_max)
% Firing rate as the inverse of the interspike interval.
%
% [time, rate] = instantaneous_rate(spikes, dt, t_max)
%
% Arguments:
% spike_times, vector containing the times of the spikes.
% dt, the temporal resolutions of the recording.
% t_max, the duration of the trial.
% spikes: vector containing the times of the spikes.
% dt : the temporal resolutions of the recording.
% 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;
rate = zeros(size(time));
time = 0:dt:t_max-dt;
rate = zeros(size(time));
isis = diff([0 spike_times]);
inst_rate = 1 ./ isis;
spike_indices = [1 round(spike_times ./ dt)];
isis = diff([0 spikes]);
inst_rate = 1 ./ isis;
spike_indices = [1 round(spikes ./ dt)];
for i = 2:length(spike_indices)
rate(spike_indices(i - 1):spike_indices(i)) = inst_rate(i - 1);
for i = 2:length(spike_indices)
rate(spike_indices(i - 1):spike_indices(i)) = inst_rate(i - 1);
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.
%
% [pdf, centers] = isi_hist(isis, binwidth)
% [pdf, centers] = isiHist(isis, binwidth)
%
% Arguments:
% 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
%
% isivec = isis( spikes )
%
% Arguments:
% 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 = [];
@ -13,4 +18,3 @@ function isivec = isis( spikes )
isivec = [ isivec; difftimes(:) ];
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.
%
% isihist(isis, binwidth)
% plotISIHist(isis, binwidth)
%
% Arguments:
% isis: vector of interspike intervals in seconds
@ -9,9 +9,9 @@ function plot_isi_hist(isis, binwidth)
% compute normalized histogram:
if nargin < 2
[pdf, centers] = isi_hist(isis);
[pdf, centers] = isiHist(isis);
else
[pdf, centers] = isi_hist(isis, binwidth);
[pdf, centers] = isiHist(isis, binwidth);
end
% plot:

View File

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

View File

@ -1,21 +1,12 @@
BASENAME=pointprocesses
PYFILES=$(wildcard *.py)
PYPDFFILES=$(PYFILES:.py=.pdf)
GPTFILES=$(wildcard *.gpt)
GPTTEXFILES=$(GPTFILES:.gpt=.tex)
all: pdf slides thumbs
include ../../chapter.mk
# script:
pdf : $(BASENAME)-chapter.pdf
$(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
pdf : chapter
# 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
rm thumbsfoils.*
watchpdf :
while true; do ! make -q pdf && make pdf; sleep 0.5; done
watchslides :
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 :
rm -f *~
rm -f $(BASENAME).aux $(BASENAME).log
rm -f $(BASENAME)-chapter.aux $(BASENAME)-chapter.log $(BASENAME)-chapter.out
clean : cleanchapter
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
rm -f $(BASENAME)-chapter.pdf $(BASENAME)-slides.pdf $(BASENAME)-handout.pdf
cleanall : clean cleanchapter
$(BASENAME)-slides.pdf $(BASENAME)-handout.pdf
help :

View File

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

View File

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

View File

@ -2,7 +2,7 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\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
Zeitpunkt des Auftretens eines Aktionspotentials von Bedeutung. Die
genaue Form des Aktionspotentials spielt keine oder nur eine
@ -10,13 +10,13 @@ untergeordnete Rolle.
Nach etwas Vorverarbeitung haben elektrophysiologische Messungen
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
(\figref{rasterexamplesfig}).
Spiketrains sind Zeitpunkte von Ereignissen --- den Aktionspotentialen
--- und deren Analyse f\"allt daher in das Gebiet der Statistik von
sogenannten \determ{Punktprozessen}.
sogenannten \determ[Punktprozess]{Punktprozessen}.
\begin{figure}[ht]
\includegraphics[width=1\textwidth]{rasterexamples}
@ -25,7 +25,9 @@ sogenannten \determ{Punktprozessen}.
(homogener Poisson Prozess mit Rate $\lambda=20$\;Hz, links) und
eines nicht-station\"aren Punktprozesses (perfect
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}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -79,11 +81,12 @@ Zeitpunkte der Ereignisse durch senkrechte Striche markiert werden.
Die Intervalle $T_i=t_{i+1}-t_i$ zwischen aufeinanderfolgenden
Ereignissen sind reelle, positive Zahlen. Bei Aktionspotentialen
heisen die Intervalle auch \enterm{Interspikeintervalle}. Deren Statistik
kann mit den \"ublichen Gr\"o{\ss}en beschrieben werden.
heisen die Intervalle auch \determ{Interspikeintervalle}
(\enterm{interspike intervals}). Deren Statistik kann mit den
\"ublichen Gr\"o{\ss}en beschrieben werden.
\begin{figure}[t]
\includegraphics[width=1\textwidth]{isihexamples}\hfill
\includegraphics[width=0.96\textwidth]{isihexamples}\vspace{-2ex}
\titlecaption{\label{isihexamplesfig}Interspikeintervall Histogramme}{der in
\figref{rasterexamplesfig} gezeigten Spikes.}
\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$.
\item Standardabweichung der Intervalle: $\sigma_{ISI} = \sqrt{\langle (T - \langle T
\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}}$.
\item Diffusions Koeffizient: $D_{ISI} =
\item \determ{Diffusionskoeffizient} (\enterm{diffusion coefficient}): $D_{ISI} =
\frac{\sigma_{ISI}^2}{2\mu_{ISI}^3}$.
\end{itemize}
\begin{exercise}{isi_hist.m}{}
Schreibe eine Funktion \code{isi\_hist()}, die einen Vektor mit Interspikeintervallen
\begin{exercise}{isiHist.m}{}
Schreibe eine Funktion \code{isiHist()}, die einen Vektor mit Interspikeintervallen
entgegennimmt und daraus ein normiertes Histogramm der Interspikeintervalle
berechnet.
\end{exercise}
\begin{exercise}{plot_isi_hist.m}{}
\begin{exercise}{plotISIHist.m}{}
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
werden. Das Histogramm soll zus\"atzlich mit Mittelwert,
Standardabweichung und Variationskoeffizient der
@ -139,9 +142,10 @@ sichtbar.
im Abstand des Lags $k$.}
\end{figure}
Solche Ab\"angigkeiten werden durch die serielle Korrelation der
Intervalle quantifiziert. Das ist der Korrelationskoeffizient
zwischen aufeinander folgenden Intervallen getrennt durch lag $k$:
Solche Ab\"angigkeiten werden durch die \determ{serielle
Korrelationen} (\enterm{serial correlations}) der Intervalle
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)}
= {\rm corr}(T_{i+k}, T_i) \]
\"Ublicherweise wird die Korrelation $\rho_k$ gegen den Lag $k$
@ -151,6 +155,7 @@ Intervalls mit sich selber).
\begin{exercise}{isiserialcorr.m}{}
Schreibe eine Funktion \code{isiserialcorr()}, die einen Vektor mit Interspikeintervallen
entgegennimmt und daraus die seriellen Korrelationen berechnet und plottet.
\pagebreak[4]
\end{exercise}
@ -170,10 +175,10 @@ durch folgende Sch\"atzer charakterisiert werden:
\item Histogramm der counts $n_i$.
\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 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}
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}
\label{firingrate}
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
Prozess}.
Beim homogenen Poisson Prozess treten Ereignisse mit einer festen Rate
$\lambda=\text{const.}$ auf und sind unabh\"angig von der Zeit $t$ und
unabh\"angig von den Zeitpunkten fr\"uherer Ereignisse
(\figref{hompoissonfig}). Die Wahrscheinlichkeit zu irgendeiner Zeit
ein Ereigniss in einem kleinen Zeitfenster der Breite $\Delta t$ zu
bekommen ist
Beim \determ[Poisson Prozess!homogener]{homogenen Poisson Prozess}
treten Ereignisse mit einer festen Rate $\lambda=\text{const.}$ auf
und sind unabh\"angig von der Zeit $t$ und unabh\"angig von den
Zeitpunkten fr\"uherer Ereignisse (\figref{hompoissonfig}). Die
Wahrscheinlichkeit zu irgendeiner Zeit ein Ereigniss in einem kleinen
Zeitfenster der Breite $\Delta t$ zu bekommen ist
\begin{equation}
\label{hompoissonprob}
P = \lambda \cdot \Delta t \; .
\end{equation}
Beim inhomogenen Poisson Prozess h\"angt die Rate $\lambda$ von der
Zeit ab: $\lambda = \lambda(t)$.
Beim \determ[Poisson Prozess!inhomogener]{inhomogenen Poisson Prozess}
h\"angt die Rate $\lambda$ von der Zeit ab: $\lambda = \lambda(t)$.
\begin{exercise}{poissonspikes.m}{}
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 Die Varianz der Intervalle ist $\sigma_{ISI}^2 = \frac{1}{\lambda^2}$ .
\item Der Variationskoeffizient ist also immer $CV_{ISI} = 1$ .
\item Die seriellen Korrelationen $\rho_k =0$ f\"ur $k>0$, da das
Auftreten der Ereignisse unabh\"angig von der Vorgeschichte ist. Ein
solcher Prozess wird auch \determ{Erneuerungsprozess} genannt (\enterm{renewal
process}).
\item Die Anzahl der Ereignisse $k$ innerhalb eines Fensters der L\"ange W ist Poissonverteilt:
\item Die \determ[serielle Korrelationen]{seriellen Korrelationen}
$\rho_k =0$ f\"ur $k>0$, da das Auftreten der Ereignisse
unabh\"angig von der Vorgeschichte ist. Ein solcher Prozess wird
auch \determ{Erneuerungsprozess} genannt (\enterm{renewal process}).
\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!} \]
(\figref{hompoissoncountfig})
\item Der Fano Faktor ist immer $F=1$ .
\item Der \determ{Fano Faktor} ist immer $F=1$ .
\end{itemize}
\begin{exercise}{hompoissonspikes.m}{}
@ -299,13 +305,11 @@ Abbildung \ref{psthfig} n\"aher erl\"autert.
\begin{figure}[tp]
\includegraphics[width=\columnwidth]{firingrates}
\titlecaption{Verschiedene Methoden die zeitabh\"angige Feuerrate
zu bestimmen.}{\textbf{A)} Rasterplot einer einzelnen neuronalen
Antwort. Jeder vertikale Strich notiert den Zeitpunkt eines
Aktionspotentials. \textbf{B)} Feurerrate aus der instantanen
Feuerrate bestimmt. \textbf{C)} klassisches PSTH mit der Binning
Methode. \textbf{D)} Feuerrate durch Faltung mit einem Gauss Kern
bestimmt.}\label{psthfig}
\titlecaption{Bestimmung der zeitabh\"angigen
Feuerrate.}{\textbf{A)} Rasterplot eines Spiketrains. \textbf{B)}
Feurerrate aus der instantanen Feuerrate bestimmt. \textbf{C)}
klassisches PSTH mit der Binning Methode. \textbf{D)} Feuerrate
durch Faltung mit einem Gauss Kern bestimmt.}\label{psthfig}
\end{figure}
@ -314,26 +318,27 @@ Abbildung \ref{psthfig} n\"aher erl\"autert.
\begin{figure}[tp]
\includegraphics[width=\columnwidth]{isimethod}
\titlecaption{Instantane Feuerrate.}{Skizze eines Spiketrains
(oben). Jeder vertikale Strich notiert den Zeitpunkt eines
Aktionspotentials. Die Pfeile zwischen aufeinanderfolgenden
(oben). Die Pfeile zwischen aufeinanderfolgenden
Aktionspotentialen mit den Zahlen in Millisekunden illustrieren
die Interspikeintervalle. Der Kehrwert des Interspikeintervalle
ergibt die instantane Feuerrate.}\label{instrate}
\end{figure}
Ein sehr einfacher Weg, die zeitabh\"angige Feuerrate zu bestimmen ist
die sogenannte \determ{instantane Feuerrate}. Dabei wird die Feuerrate
aus dem Kehrwert der Interspikeintervalle, der Zeit zwischen zwei
aufeinander folgenden Aktionspotentialen (\figref{instrate} A),
bestimmt. Die abgesch\"atzte Feuerrate (\figref{instrate} B) ist
g\"ultig f\"ur das gesammte Interspikeintervall. Diese Methode hat den
Vorteil, dass sie sehr einfach zu berechnen ist und keine Annahme
\"uber eine relevante Zeitskala (der Kodierung oder des
Auslesemechanismus der postsynaptischen Zelle) macht. $r(t)$ ist
allerdings keine kontinuierliche Funktion, die Spr\"unge in der
Feuerrate k\"onnen f\"ur manche Analysen nachteilig sein. Au{\ss}erdem
wird die Feuerrate nie gleich Null, auch wenn lange keine Aktionspotentiale
generiert wurden.
die sogenannte \determ[Feuerrate!instantane]{instantane Feuerrate}
(\enterm[firing rate!instantaneous]{instantaneous firing rate}). Dabei
wird die Feuerrate aus dem Kehrwert der Interspikeintervalle, der Zeit
zwischen zwei aufeinander folgenden Aktionspotentialen
(\figref{instrate} A), bestimmt. Die abgesch\"atzte Feuerrate
(\figref{instrate} B) ist g\"ultig f\"ur das gesammte
Interspikeintervall. Diese Methode hat den Vorteil, dass sie sehr
einfach zu berechnen ist und keine Annahme \"uber eine relevante
Zeitskala (der Kodierung oder des Auslesemechanismus der
postsynaptischen Zelle) macht. $r(t)$ ist allerdings keine
kontinuierliche Funktion, die Spr\"unge in der Feuerrate k\"onnen
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}{}
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
n\"achsten Aktionspotential misst, sch\"atzt das sogenannte
\determ{Peri-Stimulus-Zeit-Histogramm} (\enterm{peri stimulus time
histogram}, PSTH) die Wahrscheinlichkeit ab, zu einem Zeitpunkt
Aktionspotentiale anzutreffen. Es wird versucht die mittlere Rate \eqnref{firingrate}
im Grenzwert kleiner Beobachtungszeiten abzusch\"atzen:
histogram}, \determ[PSTH|see{Peri-Stimulus-Zeit-Histogramm}]{PSTH})
die Wahrscheinlichkeit ab, zu einem Zeitpunkt Aktionspotentiale
anzutreffen. Es wird versucht die mittlere Rate \eqnref{firingrate} im
Grenzwert kleiner Beobachtungszeiten abzusch\"atzen:
\begin{equation}
\label{psthrate}
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
die jeweiligen Bins fallen, gez\"ahlt (\figref{binpsth} A). Um diese
Z\"ahlungen in die Feuerrate umzurechnen muss noch mit der Binweite
normiert werden. Das ist fast so, wie beim Absch\"atzen einer
Wahrscheinlichkeitsdichte. Es kann auch die \code{hist} Funktion zur
Bestimmung des PSTHs verwendet werden.
normiert werden. Das ist \"aquivalent zur Absch\"atzung einer
Wahrscheinlichkeitsdichte. Es kann auch die \code{hist()} Funktion zur
Bestimmung des PSTHs verwendet werden. \sindex[term]{Feuerrate!Binningmethode}
Die bestimmte Feuerrate gilt f\"ur das gesamte Bin (\figref{binpsth}
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
gemacht.
\pagebreak[4]
\begin{exercise}{binnedRate.m}{}
Implementiere die Absch\"atzung der Feuerrate mit der ``binning''
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
ersetzt (Abbildung \ref{convrate} A). Wenn der Kern richtig normiert
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
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
Spiketrains.
\pagebreak[4]
\begin{exercise}{convolutionRate.m}{}
Verwende die Faltungsmethode um die Feuerrate zu bestimmen. Plotte
das Ergebnis.
@ -438,8 +446,9 @@ Spiketrains.
\section{Spike-triggered Average}
Die graphischer Darstellung der Feuerrate allein reicht nicht aus um
den Zusammenhang zwischen neuronaler Antwort und einem Stimulus zu
analysieren. Eine Methode um mehr \"uber diesen Zusammenhang zu erfahren,
ist der \enterm{Spike-triggered average} (STA). Der STA
analysieren. Eine Methode um mehr \"uber diesen Zusammenhang zu
erfahren, ist der \enterm{spike-triggered average}
(\enterm[STA|see{spike-triggered average}]{STA}). Der STA
\begin{equation}
STA(\tau) = \langle s(t - \tau) \rangle = \frac{1}{N} \sum_{i=1}^{N} s(t_i - \tau)
\end{equation}
@ -477,17 +486,20 @@ antworten.
Der STA kann auch dazu benutzt werden, aus den Antworten der Zelle den
Stimulus zu rekonstruieren (\figref{stafig} B). Bei der
\determ{invertierten Rekonstruktion} wird die Zellantwort mit dem STA
verfaltet.
\determ[invertierte Rekonstruktion]{invertierten Rekonstruktion} wird
die Zellantwort mit dem STA verfaltet.
\begin{exercise}{spikeTriggeredAverage.m}{}
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:
\vspace{-1ex}
\begin{itemize}
\setlength{\itemsep}{0ex}
\item den Spike-Triggered-Average.
\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{exercise}
@ -495,7 +507,5 @@ verfaltet.
Rekonstruiere den Stimulus mithilfe des STA und der Spike
Zeiten. Die Funktion soll Vektor als R\"uckgabewert haben, der
genauso gro{\ss} ist wie der Originalstimulus aus der Datei
\codeterm{sta\_data.mat}.
\file{sta\_data.mat}.
\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 border 0

View File

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

View File

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

View File

@ -83,4 +83,4 @@ ax.eventplot(inhspikes, colors=[[0, 0, 0]], linelength=0.8)
plt.tight_layout()
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):
plt.xkcd()
sta_ax = plt.subplot2grid((1, 3), (0, 0), rowspan=1, colspan=1)
stim_ax = plt.subplot2grid((1, 3), (0, 1), rowspan=1, colspan=2)
fig = plt.gcf()
fig.set_size_inches(15, 5)
fig.subplots_adjust(left=0.075, bottom=0.12, top=0.92, right=0.975)
fig.set_size_inches(8, 3)
fig.subplots_adjust(left=0.08, bottom=0.15, top=0.9, right=0.975)
fig.set_facecolor("white")
sta_ax.plot(sta_time * 1000, st_average, color="dodgerblue", lw=2.)
sta_ax.set_xlabel("time [ms]", fontsize=12)
sta_ax.set_ylabel("stimulus", fontsize=12)
sta_ax.set_xlim([-50, 50])
sta_ax.plot(sta_time * 1000, st_average, color="#FF9900", lw=2.)
sta_ax.set_xlabel("Time (ms)")
sta_ax.set_ylabel("Stimulus")
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.spines["right"].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["left"].set_linewidth(2.0)
sta_ax.tick_params(direction="out", width=2.0)
ylim = sta_ax.get_ylim()
xlim = sta_ax.get_xlim()
sta_ax.plot(list(xlim), [0., 0.], zorder=1, color='darkgray', ls='--', lw=0.75)
sta_ax.plot([0., 0.], list(ylim), 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=1)
sta_ax.set_xlim(list(xlim))
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, s_est, label='reconstruction', color='red', lw=2)
stim_ax.set_xlabel('time[ms]', fontsize=12)
stim_ax.set_xlim([0.0, 250])
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='#FF9900', lw=2)
stim_ax.set_xlabel('Time (ms)')
stim_ax.set_xlim(0.0, 200)
stim_ax.set_ylim([-1., 1.])
stim_ax.legend()
stim_ax.plot([0.0, 250], [0., 0.], color="darkgray", lw=0.75, ls='--', zorder=1)
stim_ax.legend(loc=(0.3, 0.85), frameon=False, fontsize=12)
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["top"].set_visible(False)
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["left"].set_linewidth(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")
plt.close()

View File

@ -3,5 +3,6 @@ counter = 1;
x = 1;
while counter <= n
x = x * counter;
counter = counter + 1
end
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');
end
if x < 0.5
disp('x is less than 0.5!');
else
disp('x is greater than or equal to 0.5!')
end
if x < 0.5
disp('x is less than 0.5!');
elseif x < 0.75

View File

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

View File

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

View File

@ -1,14 +1,3 @@
a = (11:20); % a vector with 10 Elements
fprintf('length of a: %i\n', length(a))
size_of_a = size(a); % get the size and store it in a new variable
% 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
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) % Die kurze Alternative

View File

@ -1,4 +1,3 @@
>> vectorsize
length of a: 10
number of dimensions (rank) of size_of_a: 2
number of entries in the 2nd dimesion of a: 10
s = 1 10
ans = 10
ans = 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
PYFILES=$(wildcard *.py)
PYPDFFILES=$(PYFILES:.py=.pdf)
all : pdf
# script:
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 $<
include ../../chapter.mk
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 :
while true; do ! make -q pdf && make pdf; sleep 0.5; done
# script:
pdf : chapter
clean : cleanchapter
cleanall : clean cleanchapter

View File

@ -5,8 +5,10 @@
\lstset{inputpath=../code}
\graphicspath{{images/}}
\setcounter{page}{15}
\setcounter{chapter}{0}
\typein[\pagenumber]{Number of first page}
\typein[\chapternumber]{Chapter number}
\setcounter{page}{\pagenumber}
\setcounter{chapter}{\chapternumber}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -14,5 +16,21 @@
\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}

File diff suppressed because it is too large Load Diff

View File

@ -1,32 +1,12 @@
BASENAME=programmingstyle
PYFILES=$(wildcard *.py)
PYPDFFILES=$(PYFILES:.py=.pdf)
all : pdf
# script:
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 $<
include ../../chapter.mk
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 :
while true; do ! make -q pdf && make pdf; sleep 0.5; done
# script:
pdf : chapter
clean : cleanchapter
cleanall : clean cleanchapter

View File

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

View File

@ -1,19 +1,25 @@
\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
Verst\"andnisses von Programmcode und ein Baustein in dem Bestreben
wissenschaftlichen Erkenntnisgewinn reproduzierbar zu
machen.
Programme sollten so geschrieben und strukturiert sein, dass es sowohl
einem Au{\ss}enstehenden als auch einem selbst, nach ein paar Monaten,
leicht f\"allt den Programmablauf nachzuvollziehen und zu
verstehen. Saubere Programmierung zahlt sich aber in erster Linie
f\"ur den Verfasser eines Programmes aus.
einem Au{\ss}enstehenden als auch einem selbst --- nach ein paar
Wochen oder Monaten! --- leicht f\"allt den Programmablauf
nachzuvollziehen und zu verstehen. Saubere Programmierung zahlt sich
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:
\begin{enumerate}
\item Die Struktur von Programmen.
\item Die Dateistruktur von Programmen.
\item Die Namensgebung von Skripten und Funktionen.
\item Die Namensgebung f\"ur Variablen und Konstanten.
\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
Ordnern in denen \matlab{} nach Funktionen und Skripten suchen
soll. Die Suche nach der aufgerufenen Funktion wird dabei von oben
nach unten durchgef\"uhrt. Das heisst, dass es, bei
Namensgleichheit, eine Rolle spielen kann an welcher Stelle im
nach unten durchgef\"uhrt. Das heisst, dass es bei
Namensgleichheit eine Rolle spielen kann an welcher Stelle im
Suchpfad der erste Treffer gefunden wird. Wichtig: \matlab{} sucht
nicht rekursiv! Wenn die gew\"unschte Funktion in einem Unterordner
des aktuellen Arbeitsverzeichnisses liegt, dieses aber nicht
explizit im Suchpfad enthalten ist, so wird die Funktion nicht
gefunden werden.
gefunden.
\vspace{2ex}
\includegraphics[width=0.75\textwidth]{search_path}
\includegraphics[width=0.9\textwidth]{search_path}
\vspace{1.5ex}
Der Suchpfad kann sowohl \"uber die in der Abbildung gezeigte GUI
oder auch \"uber die Kommandozeile eingestellt werden. Die GUI
erlaubt Ordner aus dem Suchpfad zu entfernen, neue
Ordner (optional 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
eine bestimmte Funktion gefunden wurde. Das aktuelle
Areitsverzeichnis wird durch den Aufruf \code{pwd} auf der
Kommandozeile ausgegeben.
Der Suchpfad kann sowohl \"uber die Kommandozeile mit dem Kommandos
\code{addpath()} und \code{userpath()} als auch\"uber die in der
Abbildung gezeigte GUI angezeigt und eingestellt werden. Die GUI
erlaubt Ordner aus dem Suchpfad zu entfernen, neue Ordner (optional
inklusive aller Unterordner) hinzuzuf\"ugen oder die Reihenfolge der
Pfade zu ver\"andern.
Zum Wechseln des aktuellen Arbeitsverzeichnisses wird das Kommando
\code{cd} verwendet. \code{which} zeigt an, in welchem Pfad eine
bestimmte Funktion gefunden wurde. Das aktuelle Areitsverzeichnis
wird durch den Aufruf \code{pwd} auf der Kommandozeile ausgegeben.
\end{ibox}
\section{Namensgebung von Funktionen und Skripten}
\matlab{} sucht Funktionen und Skripte ausschlie{\ss}lich anhand des
Namens. Dabei spielt die Gro{\ss}- und Kleinschreibung eine Rolle. Das
hei{\ss}t, dass die beiden Dateien \file{test\_funktion.m} und
\file{Test\_funktion.m} zwei unterschiedliche Funktionen benennen
k\"onnen. Diese Art der Variation des Namens ist nat\"urlich nicht
sinnvoll. Sie tr\"agt keine Information \"uber den Unterschied der
beiden Funktionen. Auch sagt der Name nahezu nichts \"uber den Zweck
der Funktion aus.
Namens. Dabei spielt die Gro{\ss}- und Kleinschreibung eine Rolle. Die
beiden Dateien \file{test\_funktion.m} und \file{Test\_Funktion.m}
zwei unterschiedliche Funktionen benennen k\"onnen. Diese Art der
Variation des Namens ist nat\"urlich nicht sinnvoll. Sie tr\"agt keine
Information \"uber den Unterschied der beiden Funktionen. Auch sagt
der Name nahezu nichts \"uber den Zweck der Funktion aus.
Die Namensgebung f\"allt mitunter nicht leicht --- manchmal ist es
sogar der schwierigste Aspekt des Programmierens! Ausdrucksstarke
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]
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:
\begin{itemize}
\item Namen werden immer klein geschrieben.
\item Es werden gerne Abk\"urzungen eingesetzt (z.B. \code{xcorr}
f\"ur die Kreuzkorrelation oder \code{repmat} f\"ur ``repeat matrix'')
\item Es werden gerne Abk\"urzungen eingesetzt (z.B. \code{xcorr()}
f\"ur die Kreuzkorrelation oder \code{repmat()} f\"ur ``repeat matrix'')
\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
Wertes in einen Text) benannt.
\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
gutem Programmierstil ist: \emph{``Programmcode muss lesbar
sein.''}. Dabei helfen gute Namen ungemein. Auch wenn es schwer
f\"allt passende und nicht zu lange Namen zu finden, sollte einer gute
Namensgebung ernst genommen werden.
f\"allt passende und trotzdem nicht zu lange Namen zu finden, sollte
einer gute Namensgebung sehr ernst genommen werden.
W\"ahrend die Namen von Funktionen und Skripten ihren Zweck
beschreiben, sollten die Namen von Variablen ihren Inhalt
beschreiben. Eine Variable, die die mittlere Anzahl von
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
angebracht (\codeterm{average\_spike\_counts}).
angebracht (\varcode{average\_spike\_counts}).
Die Laufvariablen von \code{for}-Schleifen werden oft nur \code{i},
\code{j} oder \code{k} benannt und sollten aber die einzige Ausnahme
Die Laufvariablen von \code{for}-Schleifen werden oft nur \varcode{i},
\varcode{j} oder \varcode{k} benannt und sollten aber die einzige Ausnahme
bzgl. ausdrucksstarker Namensgebung bleiben.
\begin{important}[Benennung von Variablen]
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.
\end{important}
@ -223,7 +228,7 @@ end
end
\end{lstlisting}
\clearpage
\pagebreak[4]
\begin{lstlisting}[label=cleancode, caption={\"Ubersichtliche Implementation des Random-walk.}]
num_runs = 10;
@ -248,7 +253,7 @@ Kommentarzeilen werden in \matlab{} mit dem Prozentzeichen \code{\%}
gekennzeichnet. Gezielt und sparsam eingesetzte Kommentare sind f\"ur
das Verst\"andnis eines Programms sehr n\"utzlich. Am wichtigsten
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}).
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
mit ausdrucksstarken Variablen- und Funktionsnamen ben\"otigt keine
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.
\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 Kommentare m\"ussen gepflegt werden, sonst sind sie wertlos!
\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}
\pagebreak[4]
\section{Dokumentation von Funktionen}
Bei allen vordefinierten \matlab{} Funktionen findet sich am Anfang
eine Kommentarblock, der den Zweck der Funktion, die verschiedenen
M\"oglichkeiten des Funktionsaufrufs und die Argumente und
R\"uckgabewerte beschreibt. Auch in eingenen Funktionen sind diese
Kommentare sehr hilfreich. Siehe Listing~\ref{localfunctions} f\"ur
ein Beispiel einer gut Dokumentierten Funktion.
R\"uckgabewerte beschreibt. Mit dem \code{help}- Befehl wird dieser
Kommentarblock angezeigt. Auch in eigenen Funktionen sind
diese Kommentare sehr wichtig. Siehe Listing~\ref{localfunctions}
f\"ur ein Beispiel einer gut dokumentierten Funktion.
\begin{important}[Dokumentation von Funktionen]
Funktionen m\"ussen unbedingt kommentiert werde!
\begin{itemize}
\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
Datentyp (Zahl, Vektor, Matrix, etc.), und eventuell die Einheit,
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.
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
\"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}
Das Auslagern von Funktionalit\"at in eigene Funktionen f\"uhrt
dazu, dass eine F\"ulle von Dateien erzeugt wird, die die
Das Auslagern von Funktionalit\"at in eigene Funktionen f\"uhrt dazu,
dass eine F\"ulle von Dateien erzeugt wird, die die
\"Ubersichtlichkeit nicht unbedingt erh\"oht. Wenn die auszulagernde
Funktionalit\"at an vielen Stellen ben\"otigt wird ist es
dennoch sinnvoll dies zu tun. Wenn nicht, dann bietet \matlab{} die
M\"oglichkeit sogenannte \codeterm{lokale Funktionen} oder auch
\codeterm{geschachtelte Funktionen} (\enterm{nested functions}) zu
Funktionalit\"at an vielen Stellen ben\"otigt wird ist es dennoch sehr
sinnvoll dies zu tun. Wenn Funktionen nur von einzelnen anderen
Funktionen verwendet werden, dann bietet \matlab{} die M\"oglichkeit
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
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
verf\"ugbar. Jede Funktion hat ihren eigenen G\"ultigkeitsbereich, das
hei{\ss}t, dass Variablen aus den aufrufenden Funktionen nicht
sichtbar sind. Bei sogenannten \codeterm{geschachtelten Funktionen}
ist das anders. Diese werden innerhalb eines Funktionsk\"orpers
(zwischen den Schl\"usselworten \codeterm{function} und dem
\codeterm{end} definiert und k\"onnen auf alle Variablen der
sichtbar sind.
Bei sogenannten \codeterm[Funktion!geschachtelte]{geschachtelten
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
sollten sie nur mit Bedacht eingesetzt werden.
@ -403,8 +422,20 @@ diese sollten dann beachtet werden.
Wiederholte Programmabschnitte sollten in Funktionen ausgelagert
werden. Wenn diese nicht von globalem Interesse sind, kann mit
\codeterm{lokalen} oder \codeterm{geschachtelten Funktionen} die
\"Ubersichtlichkeit erh\"oht werden.
\codeterm[Funktion!lokale]{lokalen} oder
\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
Code: A Handbook of Agile Software Craftmanship}, Prentice Hall}
\shortquote{First, solve the problem. Then, write the code.}{John
Johnson}

View File

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

View File

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

View File

@ -1,32 +1,12 @@
BASENAME=regression
PYFILES=$(wildcard *.py)
PYPDFFILES=$(PYFILES:.py=.pdf)
all : pdf
# script:
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 $<
include ../../chapter.mk
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 :
while true; do ! make -q pdf && make pdf; sleep 0.5; done
# script:
pdf : chapter
clean : cleanchapter
cleanall : clean cleanchapter

View File

@ -5,8 +5,10 @@
\lstset{inputpath=../code}
\graphicspath{{figures/}}
\setcounter{page}{89}
\setcounter{chapter}{5}
\typein[\pagenumber]{Number of first page}
\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
$y_i^{est}$ klein sein soll.
Am h\"aufigsten wird jedoch bei einem Kurvenfit der \determ{mittlere
quadratische Abstand} (\enterm{mean squared distance} oder
\enterm{mean squared error})
Am h\"aufigsten wird jedoch bei einem Kurvenfit der \determ[mittlerer
quadratische Abstand]{mittlere quadratische Abstand} (\enterm{mean
squared distance} oder \enterm{mean squared error})
\begin{equation}
\label{meansquarederror}
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.
\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
Werten $y$ und einem Vektor mit den entsprechenden Vorhersagen
$y^{est}$ berechnet.\newpage
$y^{est}$ berechnet.
\pagebreak[4]
\end{exercise}
@ -130,20 +131,21 @@ f\"ur die Zielfunktion
den mittleren quadratischen Abstand der Datenpaare $(x_i, y_i)$
gegeben die Parameterwerte $m$ und $b$ der Geradengleichung. Ziel des
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}{}
Implementiere die Zielfunktion f\"ur die Optimierung mit der
linearen Geradengleichung als Funktion \code{lsqError}.
linearen Geradengleichung als Funktion \code{lsqError()}.
\begin{itemize}
\item Die Funktion \"ubernimmt drei Argumente: Das erste Argument
ist ein 2-elementiger Vektor, der die Parameter \code{m} und
\code{b} enth\"alt. Das zweite ist ein Vektor mit den $x$-Werten,
ist ein 2-elementiger Vektor, der die Parameter \varcode{m} und
\varcode{b} enth\"alt. Das zweite ist ein Vektor mit den $x$-Werten,
an denen gemessen wurde, und das dritte ein Vektor mit den
zugeh\"origen $y$-Werten.
\item Die Funktion gibt als Ergebniss den Fehler als mittleren
quadratischen Abstand \eqnref{mseline} zur\"uck.
\item Die Funktion soll die Funktion \code{meanSquareError} der
\item Die Funktion soll die Funktion \code{meanSquareError()} der
vorherigen \"Ubung benutzen.
\end{itemize}
\end{exercise}
@ -160,7 +162,7 @@ $f_{cost}(m,b)$, die die beiden Variablen $m$ und $b$ auf einen
Fehlerwert abbildet.
Es gibt also f\"ur jeden Punkt in der sogenannten
\emph{Fehlerfl\"ache} einen Fehlerwert. In diesem Beispiel eines
\determ{Fehlerfl\"ache} einen Fehlerwert. In diesem Beispiel eines
2-dimensionalen Problems (zwei freie Parameter) kann die
Fehlerfl\"ache graphisch durch einen 3-d \enterm{surface-plot}
dargestellt werden. Dabei werden auf der $x$- und der $y$-Achse die
@ -181,12 +183,12 @@ beiden Parameter und auf der $z$-Achse der Fehlerwert aufgetragen
\begin{exercise}{errorSurface.m}{}\label{errorsurfaceexercise}%
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
quadratischen Abstand zwischen den Daten und einer Geraden mit
Steigung $m$ und $y$-Achsenabschnitt $b$, in Abh\"angigkeit von $m$
und $b$ als surface plot darstellt (siehe Hilfe f\"ur die
\code{surf} Funktion).
\code{surf()} Funktion).
\end{exercise}
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 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},
\frac{\partial f(m,b)}{\partial b} \right) \] bzgl. der beiden
Parameter $m$ und $b$ der Geradengleichung ist ein Vektor, der in
@ -299,7 +301,7 @@ partielle Ableitung nach $m$ durch
\begin{figure}[t]
\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
Steigung f\"ur verschiedene Parameterkombination aus Steigung und
$y$-Achsenabschnitt an. Die Kontourlinien im Hintergrund
@ -310,7 +312,7 @@ partielle Ableitung nach $m$ durch
\end{figure}
\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
sowie die $x$- und $y$-Werte der Messdaten als Argumente
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
(\"Ubung \ref{errorsurfaceexercise}) auch den Gradienten zu
berechnen und darzustellen. Vektoren im Raum k\"onnen mithilfe der
Funktion \code{quiver} geplottet werden.
Funktion \code{quiver()} geplottet werden.
\end{exercise}
\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
vorangegangenen \"Ubungen bereits vorbereitet. Wir brauchen: 1. Die Fehlerfunktion
(\code{meanSquareError.m}), 2. die Zielfunktion (\code{lsqError.m})
und 3. den Gradienten (\code{lsqGradient.m}). Der Algorithmus
(\code{meanSquareError()}), 2. die Zielfunktion (\code{lsqError()})
und 3. den Gradienten (\code{lsqGradient()}). Der Algorithmus
f\"ur den Abstieg lautet:
\begin{enumerate}
\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
Null ist. Da aus numerischen Gr\"unden der Gradient nie exakt Null
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 =
0.01$) in die entgegensetzte Richtung des Gradienten:
\[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}{}
Implementiere den Gradientenabstieg f\"ur das Problem der
Parameteranpassung der linearen Geradengleichung an die Messdaten in
der Datei \code{lin\_regression.mat}.
der Datei \file{lin\_regression.mat}.
\begin{enumerate}
\item Merke Dir f\"ur jeden Schritt den Fehler zwischen
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
sehen werden, kann die Position des Minimums bei Geradengleichungen
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
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
angepasst werden. Diese numerischen Tricks sind in bereits vorhandenen
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
einem Kurvenfit angeboten werden \matlabfun{lsqcurvefit}.
einem Kurvenfit angeboten werden \matlabfun{lsqcurvefit()}.
\begin{important}[Achtung Nebenminima!]
Das Finden des globalen Minimums ist leider nur selten so leicht wie

View File

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

View File

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

View File

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

View File

@ -12,16 +12,15 @@ hold off
% compute integral between x1 and x2:
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:
r = randn( 10000, 1 );
% check P:
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:
P = sum(p)*dx;
fprintf( 'The integral between -infinity and +infinity is %.3g\n', P );
fprintf( 'I.e. the probability to get any number is %.3g\n', P );
fprintf( 'Integral between -infinity and +infinity: %.3g\n', P );

View File

@ -1,32 +1,12 @@
BASENAME=statistics
PYFILES=$(wildcard *.py)
PYPDFFILES=$(PYFILES:.py=.pdf)
all : pdf
# script:
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 $<
include ../../chapter.mk
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 :
while true; do ! make -q pdf && make pdf; sleep 0.5; done
# script:
pdf : chapter
clean : cleanchapter
cleanall : clean cleanchapter

View File

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

View File

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

View File

@ -5,8 +5,10 @@
\lstset{inputpath=../code}
\graphicspath{{figures/}}
\setcounter{page}{69}
\setcounter{chapter}{3}
\typein[\pagenumber]{Number of first page}
\typein[\chapternumber]{Chapter number}
\setcounter{page}{\pagenumber}
\setcounter{chapter}{\chapternumber}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
@ -14,6 +16,13 @@
\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}

View File

@ -34,17 +34,17 @@ der Daten eingesetzt:
nicht unbedingt identsich mit dem Modus.}
\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.
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
nicht kleiner als der Median ist (\figref{medianfig}).
\newpage
\begin{exercise}{mymedian.m}{}
\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.}
\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.}
\end{exercise}
\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
below. In particular the script should test data vectors of
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
insbesondere verschieden lange Datenvektoren testen.}
\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]
\includegraphics[width=1\textwidth]{quartile}
\titlecaption{\label{quartilefig} Median und Quartile einer Normalverteilung.}{}
\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}]
% Die Quartile Q1, Q2 und Q3 unterteilen die Daten in vier gleich
% 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.}
\end{figure}
Box-Whisker Plots sind eine h\"aufig verwendete Darstellung um die
Verteilung unimodaler Daten zu visualisieren und vergleichbar zu
machen mit anderen Daten. Dabei wird um den Median eine Box vom 1. zum
3. Quartil gezeichnet. Die Whiskers deuten den minimalen und den
maximalen Datenwert an (\figref{boxwhiskerfig}).
\determ{Box-Whisker Plots} sind eine h\"aufig verwendete Darstellung
um die Verteilung unimodaler Daten zu visualisieren und vergleichbar
zu machen mit anderen Daten. Dabei wird um den Median eine Box vom
1. zum 3. Quartil gezeichnet. Die Whiskers deuten den minimalen und
den maximalen Datenwert an (\figref{boxwhiskerfig}).
\begin{exercise}{boxwhisker.m}{}
\tr{Generate eine $40 \times 10$ matrix of random numbers and
@ -111,25 +112,12 @@ maximalen Datenwert an (\figref{boxwhiskerfig}).
\section{\tr{Histogram}{Histogramm}}
Histogramme z\"ahlen die H\"aufigkeit $n_i$ des Auftretens von
$N=\sum_{i=1}^M n_i$ Messwerten in $M$ Messbereichsklassen $i$ (Bins).
Die Klassen unterteilen den Wertebereich meist in angrenzende und
gleich gro{\ss}e Intervalle. Histogramme k\"onnen verwendet werden, um die
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}
\determ[Histogramm]{Histogramme} z\"ahlen die H\"aufigkeit $n_i$ des
Auftretens von $N=\sum_{i=1}^M n_i$ Messwerten in $M$
Messbereichsklassen $i$ (Bins). Die Klassen unterteilen den
Wertebereich meist in angrenzende und gleich gro{\ss}e Intervalle.
Histogramme k\"onnen verwendet werden, um die
\determ{Wahrscheinlichkeitsverteilung} der Messwerte abzusch\"atzen.
\begin{figure}[t]
\includegraphics[width=1\textwidth]{diehistograms}
@ -141,7 +129,6 @@ Wahrscheinlichkeitsverteilung der Messwerte abzusch\"atzen.
vergleichbar.}
\end{figure}
\newpage
Bei ganzzahligen Messdaten (z.B. die Augenzahl eines W\"urfels oder
die Anzahl von Aktionspotentialen in einem bestimmten Zeitfenster)
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
\[ 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}}
@ -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$
\[ P(x_0<x<x_0+\Delta x) \approx p(x) \cdot \Delta x \; . \]
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
jeden positiven Wert annehmen und hat als Einheit den Kehrwert der
Einheit von $x$.
@ -190,19 +189,21 @@ Da die Wahrscheinlichkeit irgendeines Wertes $x$ Eins ergeben muss gilt die Norm
\label{pdfnorm}
P(-\infty < x < \infty) = \int\limits_{-\infty}^{+\infty} p(x) \, dx = 1 \; .
\end{equation}
\pagebreak[2]
Die gesamte Funktion $p(x)$, die jedem Wert $x$ einen
Wahrscheinlichkeitsdichte zuordnet wir auch
Wahrscheinlichkeitsdichtefunktion (``probability density function'',
``pdf'', oder kurz ``density'') genannt. Die bekannteste
Wahrscheinlichkeitsdichtefunktion ist die der Normalverteilung
\determ{Wahrscheinlichkeitsdichtefunktion} (\enterm{probability
density function}, \enterm[pdf|see{probability density
function}]{pdf}, oder kurz \enterm[density|see{probability density
function}]{density}) genannt. Die bekannteste
Wahrscheinlichkeitsdichtefunktion ist die der \determ{Normalverteilung}
\[ p_g(x) =
\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$.
\newpage
\begin{exercise}{gaussianpdf.m}{gaussianpdf.out}
\vspace{-3ex}
\begin{enumerate}
\item Plotte die Wahrscheinlichkeitsdichte der Normalverteilung $p_g(x)$.
\item Berechne f\"ur die Normalverteilung mit Mittelwert Null und
@ -217,13 +218,13 @@ Standardabweichung $\sigma$.
\begin{figure}[t]
\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
des absoluten Histogramms h\"angt von der Klassenbreite
ab. Rechts: Bei auf das Integral normierten Histogrammen werden
auch unterschiedliche Klassenbreiten untereinander vergleichbar
und auch mit der theoretischen Wahrschinlichkeitsdichtefunktion
(blau).}}
(blau).}
\end{figure}
\begin{exercise}{gaussianbins.m}{}
@ -233,6 +234,7 @@ Standardabweichung $\sigma$.
unterschiedlichen Klassenbreiten. Was f\"allt auf?}
\end{exercise}
\pagebreak[2]
Damit Histogramme von reellen Messwerten trotz unterschiedlicher
Anzahl von Messungen und unterschiedlicher Klassenbreiten
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
$\Delta x$ der Klassen geteilt werden (\figref{pdfhistogramfig}).
\pagebreak[4]
\begin{exercise}{gaussianbinsnorm.m}{}
Normiere das Histogramm der vorherigen \"Ubung zu einer Wahrscheinlichkeitsdichte.
\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
angeschaut. Bei mehreren Me{\ss}gr\"o{\ss}en, kann nach
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
(x-\langle x \rangle)(y-\langle y \rangle) \rangle}{\sqrt{\langle
(x-\langle x \rangle)^2} \rangle \sqrt{\langle (y-\langle y
\rangle)^2} \rangle} \]
quantifiziert einfache lineare Zusammenh\"ange \matlabfun{corr}. Der
Korrelationskoeffizient ist die Covarianz normiert durch die
quantifiziert einfache lineare Zusammenh\"ange \matlabfun{corr()}. Der
Korrelationskoeffizient ist die \determ{Kovarianz} normiert durch die
Standardabweichungen. Perfekt korrelierte Variablen ergeben einen
Korrelationskoeffizienten von $+1$, antikorrelierte 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]
\includegraphics[width=1\textwidth]{nonlincorrelation}
\titlecaption{\label{nonlincorrelationfig} Korrelationen von
\titlecaption{\label{nonlincorrelationfig} Korrelationen bei
nichtlineare Zusammenh\"angen.}{Der Korrelationskoeffizienten
erfasst nur lineare Zusammenh\"ange. Sowohl die quadratische
Abh\"angigkeit (links) als auch eine Rauschkorrelation (rechts),