108 lines
4.2 KiB
TeX
108 lines
4.2 KiB
TeX
\documentclass[12pt,a4paper,pdftex]{exam}
|
|
|
|
\newcommand{\exercisetopic}{Gradient descent}
|
|
\newcommand{\exercisenum}{9}
|
|
\newcommand{\exercisedate}{December 22th, 2020}
|
|
|
|
\input{../../exercisesheader}
|
|
|
|
\firstpagefooter{Prof. Dr. Jan Benda}{}{jan.benda@uni-tuebingen.de}
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
\begin{document}
|
|
|
|
\input{../../exercisestitle}
|
|
|
|
\begin{questions}
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
\question \qt{Read sections 8.1 -- 8.5 of chapter 8 on ``optimization
|
|
and gradient descent!}\vspace{-3ex}
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
\question \qt{Fitting the time constant of an exponential function}
|
|
Let's assume we record the membrane potential from a photoreceptor
|
|
neuron. We define the resting potential of the neuron to be at
|
|
0\,mV. By means of a brief current injection we increase the
|
|
membrane potential by exactly 1\,mV. We then record how the membrane
|
|
potential decays exponentially down to the resting potential. We are
|
|
interested in the membrane time constant and therefore want to fit
|
|
an exponential function to the recorded time course of the membrane
|
|
potential.
|
|
|
|
\begin{parts}
|
|
\part Implement (and document!) the exponential function
|
|
\begin{equation}
|
|
\label{expfunc}
|
|
x(t) = e^{-t/\tau}
|
|
\end{equation}
|
|
with the membrane time constant $\tau$ as a matlab function
|
|
\code{expdecay(t, tau)} that takes as arguments a vector of
|
|
time points and the membrane time constant. The function returns
|
|
\eqnref{expfunc} computed for each time point as a vector.
|
|
\begin{solution}
|
|
\lstinputlisting{expdecay.m}
|
|
\end{solution}
|
|
|
|
\part Let's first generate the data. Set the membrane time
|
|
constant to 10\,ms. Generate a time vector with sample times
|
|
between zero and five times the membrane time constant and a
|
|
sampling interval of 0.05\,ms. Then compute a vector containing
|
|
the corresponding measurements of the membrane potential using the
|
|
\code{expdecay()} function and adding some measurement noise with
|
|
a standard deviation of 0.05\.mV (\code{randn()} function). Also
|
|
plot the data.
|
|
\begin{solution}
|
|
\lstinputlisting{expdecaydata.m}
|
|
\end{solution}
|
|
|
|
\part Implement the gradient descent algorithm for finding the
|
|
least squares for the exponential function \eqref{expfunc}. The
|
|
function takes as arguments the measured data, an initial value
|
|
for the estimation of the membrane time constant, the $\epsilon$
|
|
factor, and the threshold for the length of the gradient where to
|
|
terminate the algorithm. The function should return the estimated
|
|
membrane time constant at the minimum of the mean squared error, a
|
|
vector with the time constants, and a vector with the mean squared
|
|
errors for each step of the algorithm.
|
|
\begin{solution}
|
|
\lstinputlisting{expdecaydescent.m}
|
|
\end{solution}
|
|
|
|
\part Call the gradient descent function with the generated data.
|
|
Watch the value of the gradient and of tau and adapt $\epsilon$
|
|
and the threshold accordingly (they differ quite dramatically from
|
|
the ones in the script for the cubic fit).
|
|
|
|
\part Generate three plots: (i) the values of the time constant
|
|
for each iteration step, (ii) the mean squared error for each
|
|
iteration step, and (iii) the measured data and the fitted
|
|
exponential function.
|
|
\begin{solution}
|
|
\lstinputlisting{expdecayplot.m}
|
|
\end{solution}
|
|
|
|
\end{parts}
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
\question \qt{Read sections 8.6 -- 8.8 of chapter 8 on ``optimization
|
|
and gradient descent!}\vspace{-3ex}
|
|
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
\question \qt{Fitting the full exponential function}
|
|
\begin{parts}
|
|
|
|
\part Use the functions \code{polyfit()} and \code{lsqcurvefit()}
|
|
provided by matlab to find the slope and intercept of a straight
|
|
line that fits the data. Compare the resulting fit parameters of
|
|
those functions with the ones of your gradient descent algorithm.
|
|
\begin{solution}
|
|
\lstinputlisting{linefit.m}
|
|
\end{solution}
|
|
|
|
\end{parts}
|
|
|
|
\end{questions}
|
|
|
|
\end{document}
|