updated populationvector project

This commit is contained in:
Jan Benda 2018-01-17 16:25:33 +01:00
parent 6ef0bce722
commit eca31e3c95
62 changed files with 47 additions and 37 deletions

View File

@ -1,4 +1,4 @@
all: projects evalutation
all: projects evaluation
evaluation: evaluation.pdf
evaluation.pdf: evaluation.tex

View File

@ -15,7 +15,7 @@
\begin{document}
\sffamily
\section*{Scientific computing WS16/17}
\section*{Scientific computing WS17/18}
\begin{tabular}{|p{0.15\textwidth}|p{0.07\textwidth}|p{0.07\textwidth}|p{0.07\textwidth}|p{0.07\textwidth}|p{0.07\textwidth}|p{0.07\textwidth}|p{0.07\textwidth}|p{0.07\textwidth}|p{0.07\textwidth}|}
\hline

View File

@ -11,7 +11,7 @@
%%%%%%%%%%%%%% Questions %%%%%%%%%%%%%%%%%%%%%%%%%
%\section{REPLACE BY SUBTHRESHOLD RESONANCE PROJECT!}
\section{REPLACE BY SUBTHRESHOLD RESONANCE PROJECT!}
\begin{questions}
\question You are recording the activity of a neuron in response to
constant stimuli of intensity $I$ (think of that, for example,

View File

@ -69,15 +69,15 @@ plt.show()
# tuning curves:
nunits = 6
unitphases = np.linspace(0.0, 1.0, nunits) + 0.05*np.random.randn(nunits)/float(nunits)
unitphases = np.linspace(0.04, 0.96, nunits) + 0.05*np.random.randn(nunits)/float(nunits)
unitgains = 15.0 + 5.0*(2.0*np.random.rand(nunits)-1.0)
nangles = 12
angles = 180.0*np.arange(nangles)/nangles
for unit, (phase, gain) in enumerate(zip(unitphases, unitgains)):
print '%.1f %.0f' % (gain, phase*180.0)
print 'gain=%.1f phase=%.0f' % (gain, phase*180.0)
allspikes = []
for k, angle in enumerate(angles):
spikes = lifadaptspikes(0.5*(1.0-np.cos(2.0*np.pi*(angle/180.0-phase))), gain)
spikes = lifadaptspikes(0.5*(1.0+np.cos(2.0*np.pi*(angle/180.0-phase))), gain)
allspikes.append(spikes)
spikesobj = np.zeros((len(allspikes), len(allspikes[0])), dtype=np.object)
for k in range(len(allspikes)):
@ -89,10 +89,10 @@ for unit, (phase, gain) in enumerate(zip(unitphases, unitgains)):
nangles = 50
angles = 180.0*np.random.rand(nangles)
for k, angle in enumerate(angles):
print '%.0f' % angle
print 'angle = %.0f' % angle
allspikes = []
for unit, (phase, gain) in enumerate(zip(unitphases, unitgains)):
spikes = lifadaptspikes(0.5*(1.0-np.cos(2.0*np.pi*(angle/180.0-phase))), gain)
spikes = lifadaptspikes(0.5*(1.0+np.cos(2.0*np.pi*(angle/180.0-phase))), gain)
allspikes.append(spikes)
spikesobj = np.zeros((len(allspikes), len(allspikes[0])), dtype=np.object)
for i in range(len(allspikes)):

View File

@ -35,8 +35,6 @@
\texttt{spikes} variables of the \texttt{population*.mat} files.
The \texttt{angle} variable holds the angle of the presented bar.
%NOTE: the orientation is angle plus 90 degree!!!!!!
\continue
\begin{parts}
\part Illustrate the spiking activity of the V1 cells in response
@ -50,13 +48,11 @@
of the neurons.
\part Fit the function \[ r(\varphi) =
g(1-\cos(\varphi-\varphi_0))/2 \] to the measured tuning curves in
g(1+\cos(\varphi-\varphi_0))/2 \] to the measured tuning curves in
order to estimated the orientation angle at which the neurons
respond strongest. In this function $\varphi_0$ is the position of
the peak (really? How exactly is $\varphi_0$ related to the
position of the peak? Do you find a better function where
$\varphi_0$ is identical with the peak position?) and $g$ is a
gain factor that sets the maximum firing rate.
the peak and $g$ is a gain factor that sets the maximum firing
rate.
\part How can the orientation angle of the presented bar be read
out from one trial of the population activity of the 6 neurons?
@ -70,8 +66,8 @@
An alternative read out is maximum likelihood (see script).
Load one of the \texttt{population*.mat} files, illustrate the
data, and estimate the orientation angle of the bar by the two
different methods.
data, and estimate the orientation angle of the bar from single
trial data by the two different methods.
\part Compare, illustrate and discuss the performance of your two
decoding methods by using all of the recorded responses (all
@ -81,16 +77,16 @@
\end{parts}
\end{questions}
%NOTE: change data generation such that the phase variable is indeed
%the maximum response and not the minumum!
\end{document}
gains and angles of the 6 neurons:
14.6 0
17.1 36
17.6 72
14.1 107
10.7 144
11.4 181
gain=10.7 phase=5
gain=18.0 phase=38
gain=11.3 phase=71
gain=14.1 phase=108
gain=19.0 phase=138
gain=16.4 phase=174

View File

@ -1,7 +1,9 @@
close all
files = dir('../unit*.mat');
datapath = '../';
% datapath = '../code/';
files = dir(strcat(datapath, 'unit*.mat'));
for file = files'
a = load(strcat('../', file.name));
a = load(strcat(datapath, file.name));
spikes = a.spikes;
angles = a.angles;
figure()
@ -14,13 +16,13 @@ end
%% tuning curves:
close all
cosine = @(p,xdata)0.5*p(1).*(1.0-cos(2.0*pi*(xdata/180.0-p(2))));
files = dir('../unit*.mat');
cosine = @(p,xdata)0.5*p(1).*(1.0+cos(2.0*pi*(xdata/180.0-p(2))));
files = dir(strcat(datapath, 'unit*.mat'));
phases = zeros(length(files), 1);
figure()
for j = 1:length(files)
file = files(j);
a = load(strcat('../', file.name));
a = load(strcat(datapath, file.name));
spikes = a.spikes;
angles = a.angles;
rates = zeros(size(spikes, 1), 1);
@ -32,10 +34,13 @@ for j = 1:length(files)
p0 = [mr, angles(maxi)/180.0-0.5];
%p = p0;
p = lsqcurvefit(cosine, p0, angles, rates');
phase = p(2)*180.0 + 90.0;
phase = p(2)*180.0;
if phase > 180.0
phase = phase - 180.0;
end
if phase < 0.0
phase = phase + 180.0;
end
phases(j) = phase;
subplot(2, 3, j);
plot(angles, rates, 'b');
@ -49,40 +54,45 @@ end
%% read out:
a = load('../population04.mat');
a = load(strcat(datapath, 'population04.mat'));
spikes = a.spikes;
angle = a.angle;
unitphases = a.phases*180.0 + 90.0;
unitphases = a.phases*180.0;
unitphases(unitphases>180.0) = unitphases(unitphases>180.0) - 180.0;
figure();
subplot(1, 3, 1);
angleestimates1 = zeros(size(spikes, 2), 1);
angleestimates2 = zeros(size(spikes, 2), 1);
[x, inx] = sort(phases);
% loop over trials:
for j = 1:size(spikes, 2)
rates = zeros(size(spikes, 1), 1);
for k = 1:size(spikes, 1)
r = firingrate(spikes(k, j), 0.0, 0.2);
rates(k) = r;
end
[x, inx] = sort(phases);
plot(phases(inx), rates(inx), '-o');
hold on;
angleestimates1(j) = popvecangle(phases, rates);
[m, i] = max(rates);
angleestimates2(j) = phases(i);
end
xlabel('preferred angle')
ylabel('firing rate')
hold off;
subplot(1, 3, 2);
hist(angleestimates1);
xlabel('stimulus angle')
subplot(1, 3, 3);
hist(angleestimates2);
xlabel('stimulus angle')
angle
mean(angleestimates1)
mean(angleestimates2)
%% read out robustness:
files = dir('../population*.mat');
files = dir(strcat(datapath, 'population*.mat'));
angles = zeros(length(files), 1);
e1m = zeros(length(files), 1);
e1s = zeros(length(files), 1);
@ -90,7 +100,7 @@ e2m = zeros(length(files), 1);
e2s = zeros(length(files), 1);
for i = 1:length(files)
file = files(i);
a = load(strcat('../', file.name));
a = load(strcat(datapath, file.name));
spikes = a.spikes;
angle = a.angle;
angleestimates1 = zeros(size(spikes, 2), 1);
@ -114,5 +124,9 @@ end
figure();
subplot(1, 2, 1);
scatter(angles, e1m);
xlabel('stimuluis angle')
ylabel('estimated angle')
subplot(1, 2, 2);
scatter(angles, e2m);
xlabel('stimuluis angle')
ylabel('estimated angle')