diff --git a/Makefile b/Makefile index 2a9b5ef..a06b476 100644 --- a/Makefile +++ b/Makefile @@ -10,6 +10,7 @@ chapters : $(BASENAME).pdf : $(BASENAME).tex header.tex $(SUBTEXS) pdflatex -interaction=scrollmode $< | tee /dev/stderr | fgrep -q "Rerun to get cross-references right" && pdflatex -interaction=scrollmode $< || true + splitindex $(BASENAME).idx again : pdflatex $(BASENAME).tex diff --git a/bootstrap/lecture/bootstrap-chapter.tex b/bootstrap/lecture/bootstrap-chapter.tex index 7ecd9a5..29816da 100644 --- a/bootstrap/lecture/bootstrap-chapter.tex +++ b/bootstrap/lecture/bootstrap-chapter.tex @@ -5,7 +5,7 @@ \lstset{inputpath=../code} \graphicspath{{figures/}} -\setcounter{page}{81} +\setcounter{page}{69} \setcounter{chapter}{4} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/bootstrap/lecture/bootstrap.tex b/bootstrap/lecture/bootstrap.tex index 7a4fbe8..30fd834 100644 --- a/bootstrap/lecture/bootstrap.tex +++ b/bootstrap/lecture/bootstrap.tex @@ -116,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. diff --git a/bootstrap/lecture/bootstrapsem.py b/bootstrap/lecture/bootstrapsem.py index 7b9ac22..347f40f 100644 --- a/bootstrap/lecture/bootstrapsem.py +++ b/bootstrap/lecture/bootstrapsem.py @@ -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 diff --git a/bootstrap/lecture/permutecorrelation.py b/bootstrap/lecture/permutecorrelation.py index 580e12b..0f2ac14 100644 --- a/bootstrap/lecture/permutecorrelation.py +++ b/bootstrap/lecture/permutecorrelation.py @@ -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: diff --git a/designpattern/lecture/designpattern-chapter.tex b/designpattern/lecture/designpattern-chapter.tex index 4a44fbf..31c6e00 100644 --- a/designpattern/lecture/designpattern-chapter.tex +++ b/designpattern/lecture/designpattern-chapter.tex @@ -5,7 +5,7 @@ \lstset{inputpath=../code} \graphicspath{{figures/}} -\setcounter{page}{133} +\setcounter{page}{121} \setcounter{chapter}{8} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/designpattern/lecture/designpattern.tex b/designpattern/lecture/designpattern.tex index 1965ee8..1c1a8be 100644 --- a/designpattern/lecture/designpattern.tex +++ b/designpattern/lecture/designpattern.tex @@ -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,7 +84,6 @@ 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 \varcode{zeros()} und \varcode{ones()}}] x = -1:0.01:2; % Vektor mit x-Werten @@ -146,12 +144,10 @@ Die \code{histogram()} Funktion macht das mit den entsprechenden Parametern auto x = randn(100, 1); % irgendwelche reellwertige Daten histogram(x, 'Normalization', 'pdf'); \end{lstlisting} - \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 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 @@ -159,7 +155,6 @@ x = randn(100, 1); % irgendwelche reellwertige Daten 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 \varcode{hist()}- und \varcode{bar()}-Funktion}] x = randi(6, 100, 1); % irgendwelche integer Daten [h, b] = hist(x); % Histogram berechnen diff --git a/likelihood/lecture/likelihood-chapter.tex b/likelihood/lecture/likelihood-chapter.tex index 0f74fe3..714919a 100644 --- a/likelihood/lecture/likelihood-chapter.tex +++ b/likelihood/lecture/likelihood-chapter.tex @@ -5,7 +5,7 @@ \lstset{inputpath=../code} \graphicspath{{figures/}} -\setcounter{page}{101} +\setcounter{page}{89} \setcounter{chapter}{6} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/likelihood/lecture/likelihood.tex b/likelihood/lecture/likelihood.tex index 6a8e210..6c98f37 100644 --- a/likelihood/lecture/likelihood.tex +++ b/likelihood/lecture/likelihood.tex @@ -118,10 +118,11 @@ 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 \determ{Kurvenfit} soll eine Funktion $f(x;\theta)$ mit den Parametern @@ -251,7 +252,7 @@ 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} diff --git a/likelihood/lecture/mlepropline.py b/likelihood/lecture/mlepropline.py index fc28d48..fcaa97a 100644 --- a/likelihood/lecture/mlepropline.py +++ b/likelihood/lecture/mlepropline.py @@ -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 diff --git a/pointprocesses/code/binnedRate.m b/pointprocesses/code/binnedRate.m index fd8996d..e34366c 100644 --- a/pointprocesses/code/binnedRate.m +++ b/pointprocesses/code/binnedRate.m @@ -1,19 +1,24 @@ -function [time, rate] = binned_rate(spike_times, bin_width, dt, t_max) -% Calculates the firing rate with the binning method. The hist funciton 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 + diff --git a/pointprocesses/code/convolutionRate.m b/pointprocesses/code/convolutionRate.m index 31bd06d..dbe0dae 100644 --- a/pointprocesses/code/convolutionRate.m +++ b/pointprocesses/code/convolutionRate.m @@ -1,16 +1,20 @@ -function [time, rate] = convolution_rate(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 = gauss_kernel(sigma, dt); diff --git a/pointprocesses/code/instantaneousRate.m b/pointprocesses/code/instantaneousRate.m index c8a4da5..8928c31 100644 --- a/pointprocesses/code/instantaneousRate.m +++ b/pointprocesses/code/instantaneousRate.m @@ -1,22 +1,24 @@ -function [time, rate] = instantaneous_rate(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 the vector representing time and a vector containing 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 - - diff --git a/pointprocesses/code/isi_hist.m b/pointprocesses/code/isiHist.m similarity index 90% rename from pointprocesses/code/isi_hist.m rename to pointprocesses/code/isiHist.m index f529f8c..4f28f32 100644 --- a/pointprocesses/code/isi_hist.m +++ b/pointprocesses/code/isiHist.m @@ -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 diff --git a/pointprocesses/code/isis.m b/pointprocesses/code/isis.m index 869cb60..b927abd 100644 --- a/pointprocesses/code/isis.m +++ b/pointprocesses/code/isis.m @@ -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 - diff --git a/pointprocesses/code/plot_isi_hist.m b/pointprocesses/code/plotISIHist.m similarity index 86% rename from pointprocesses/code/plot_isi_hist.m rename to pointprocesses/code/plotISIHist.m index 9fb6bf9..e181c3a 100644 --- a/pointprocesses/code/plot_isi_hist.m +++ b/pointprocesses/code/plotISIHist.m @@ -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: diff --git a/pointprocesses/code/reconstructStimulus.m b/pointprocesses/code/reconstructStimulus.m index 51cb0b1..6c46a40 100644 --- a/pointprocesses/code/reconstructStimulus.m +++ b/pointprocesses/code/reconstructStimulus.m @@ -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 diff --git a/pointprocesses/code/spikeTriggeredAverage.m b/pointprocesses/code/spikeTriggeredAverage.m index 6954f43..fcc0352 100644 --- a/pointprocesses/code/spikeTriggeredAverage.m +++ b/pointprocesses/code/spikeTriggeredAverage.m @@ -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); diff --git a/pointprocesses/lecture/pointprocesses.tex b/pointprocesses/lecture/pointprocesses.tex index 3ca29cc..8437aa4 100644 --- a/pointprocesses/lecture/pointprocesses.tex +++ b/pointprocesses/lecture/pointprocesses.tex @@ -86,7 +86,7 @@ heisen die Intervalle auch \determ{Interspikeintervalle} \"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} @@ -113,15 +113,15 @@ heisen die Intervalle auch \determ{Interspikeintervalle} \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 @@ -155,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} @@ -395,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. @@ -435,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. @@ -490,10 +493,13 @@ die Zellantwort mit dem STA verfaltet. Implementiere eine Funktion, die den STA ermittelt. Verwende dazu 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} diff --git a/regression/lecture/regression-chapter.tex b/regression/lecture/regression-chapter.tex index 0df5e2b..27ab07c 100644 --- a/regression/lecture/regression-chapter.tex +++ b/regression/lecture/regression-chapter.tex @@ -5,7 +5,7 @@ \lstset{inputpath=../code} \graphicspath{{figures/}} -\setcounter{page}{89} +\setcounter{page}{77} \setcounter{chapter}{5} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% diff --git a/regression/lecture/regression.tex b/regression/lecture/regression.tex index eaceaa0..ffa32c2 100644 --- a/regression/lecture/regression.tex +++ b/regression/lecture/regression.tex @@ -84,7 +84,8 @@ zus\"atzlich gro{\ss}e Abst\"ande st\"arker gewichtet. 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} @@ -315,6 +316,7 @@ partielle Ableitung nach $m$ durch 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. + \pagebreak[4] \end{exercise} \begin{exercise}{errorGradient.m}{} @@ -376,6 +378,7 @@ Punkte in Abbildung \ref{gradientdescentfig} gro{\ss}. Funktion der Optimierungsschritte zeigt. \item Erstelle einen Plot, der den besten Fit in die Daten plottet. \end{enumerate} + \pagebreak \end{exercise}