linear algebra first scripts
This commit is contained in:
parent
948e00a21a
commit
490c6161f8
82
linearalgebra/simulations/covareigen.m
Normal file
82
linearalgebra/simulations/covareigen.m
Normal file
@ -0,0 +1,82 @@
|
||||
function covareigen( x, y, pm, w, h )
|
||||
% computes covariance matrix from the pairs x, y
|
||||
% diagonalizes covariance matrix
|
||||
% x and y are column vectors
|
||||
% pm: 0 - scatter of data, 1 histogram, 2 multivariate gauus from
|
||||
% covariance matrix, 1 and 2 require w and h
|
||||
% w and h are the width and the height (in data units) for plotting
|
||||
% histograms instead of scatter
|
||||
|
||||
% covariance matrix:
|
||||
cv = cov( [ x y ] );
|
||||
|
||||
% eigen values:
|
||||
[ v , d] = eig( cv )
|
||||
s = sign( v );
|
||||
s(1,:) = s(2,:);
|
||||
v = v .* s;
|
||||
|
||||
% plots:
|
||||
subplot( 2, 2, 1 );
|
||||
hold on;
|
||||
|
||||
if (pm > 0) & (nargin == 5)
|
||||
if pm == 1
|
||||
% histogram of data:
|
||||
xp = -w:0.5:w;
|
||||
yp = -h:0.5:h;
|
||||
[n,c] = hist3([x y], { xp, yp } );
|
||||
contourf( c{1}, c{2}, n' );
|
||||
else
|
||||
xp = -w:0.1:w;
|
||||
yp = -h:0.1:h;
|
||||
[xg,yg] = meshgrid( xp, yp );
|
||||
xy = [ xg(:) yg(:) ];
|
||||
gauss = reshape( exp(-0.5*diag(xy*inv(cv)*xy'))/sqrt((2.0*pi)^2.0*det(cv)), size( xg ) );
|
||||
contourf( xp, yp, gauss )
|
||||
end
|
||||
colormap( 'gray' );
|
||||
else
|
||||
% scatter plot:
|
||||
scatter( x, y, 'b', 'filled', 'MarkerEdgeColor', 'white' );
|
||||
end
|
||||
|
||||
% plot eigenvectors:
|
||||
quiver( ones( 1, 2 ).*mean( x ), ones( 1, 2 )*mean(y), v(1,:).*sqrt(diag(d))', v(2,:).*sqrt(diag(d))', 'r', 'LineWidth', 3, 'AutoScale', 'off', 'AutoScaleFactor', 1.0, 'MaxHeadSize', 0.7 )
|
||||
|
||||
axis( 'equal' );
|
||||
hold off;
|
||||
|
||||
subplot( 2, 2, 3 );
|
||||
hist( x, 50, 'b' );
|
||||
|
||||
% sort the eigenvalues:
|
||||
[d,inx] = sort( diag(d), 'descend' );
|
||||
|
||||
subplot( 2, 2, 2 );
|
||||
hold on;
|
||||
% subtract means:
|
||||
x = x - mean( x );
|
||||
y = y - mean( y );
|
||||
% project onto eigenvectors:
|
||||
nx = [ x y ] * v(:,inx(1));
|
||||
ny = [ x y ] * v(:,inx(2));
|
||||
cv = cov( [nx, ny] )
|
||||
[ v , d] = eig( cv )
|
||||
if (pm > 0) & (nargin == 5)
|
||||
if pm == 1
|
||||
[n,c] = hist3([nx ny], { xp, yp } );
|
||||
contourf( c{1}, c{2}, n' );
|
||||
else
|
||||
gauss = reshape( exp(-0.5*diag(xy*inv(cv)*xy'))/sqrt((2.0*pi)^2.0*det(cv)), size( xg ) );
|
||||
contourf( xp, yp, gauss )
|
||||
end
|
||||
else
|
||||
scatter( nx, ny, 'b', 'filled', 'MarkerEdgeColor', 'white' );
|
||||
end
|
||||
axis( 'equal' );
|
||||
hold off;
|
||||
|
||||
subplot( 2, 2, 4 );
|
||||
hist( nx, 50, 'b' );
|
||||
end
|
45
linearalgebra/simulations/covareigen3.m
Normal file
45
linearalgebra/simulations/covareigen3.m
Normal file
@ -0,0 +1,45 @@
|
||||
function covareigen3( x, y, z )
|
||||
% computes covariance matrix from the triples x, y, z
|
||||
% diagonalizes covariance matrix
|
||||
% x, y and z are column vectors
|
||||
|
||||
% covariance matrix:
|
||||
cv = cov( [ x y z ] );
|
||||
|
||||
% eigen values:
|
||||
[ v , d] = eig( cv )
|
||||
|
||||
% plots:
|
||||
subplot( 1, 2, 1 );
|
||||
hold on;
|
||||
|
||||
% scatter plot:
|
||||
view( 3 );
|
||||
scatter3( x, y, z, 0.1, 'b', 'filled', 'MarkerEdgeColor', 'blue' );
|
||||
xlabel( 'x' );
|
||||
ylabel( 'y' );
|
||||
zlabel( 'z' );
|
||||
grid on;
|
||||
|
||||
% plot eigenvectors:
|
||||
quiver3( ones( 1, 3 ).*mean( x ), ones( 1, 3 )*mean(y), ones( 1, 3 )*mean(z), v(1,:).*sqrt(diag(d))', v(2,:).*sqrt(diag(d))', v(3,:).*sqrt(diag(d))', 'r', 'LineWidth', 3, 'AutoScale', 'off', 'AutoScaleFactor', 1.0, 'MaxHeadSize', 0.7 )
|
||||
|
||||
%axis( 'equal' );
|
||||
hold off;
|
||||
|
||||
% sort the eigenvalues:
|
||||
[d,inx] = sort( diag(d), 'descend' );
|
||||
|
||||
subplot( 2, 2, 2 );
|
||||
hold on;
|
||||
% subtract means:
|
||||
x = x - mean( x );
|
||||
y = y - mean( y );
|
||||
% project onto eigenvectors:
|
||||
nx = [ x y z ] * v(:,inx(1));
|
||||
ny = [ x y z ] * v(:,inx(2));
|
||||
scatter( nx, ny, 'b', 'filled', 'MarkerEdgeColor', 'white' );
|
||||
axis( 'equal' );
|
||||
hold off;
|
||||
|
||||
end
|
14
linearalgebra/simulations/covareigen3examples.m
Normal file
14
linearalgebra/simulations/covareigen3examples.m
Normal file
@ -0,0 +1,14 @@
|
||||
n = 10000;
|
||||
|
||||
% three distributions:
|
||||
x = randn( n, 1 );
|
||||
y = randn( n, 1 );
|
||||
z = randn( n, 1 );
|
||||
f = figure( 'Position', [ scrsz(3)/2 scrsz(4)/2 scrsz(3)/2 scrsz(4)/2 ]);
|
||||
d = [ 0 4 -4 8 ];
|
||||
for k = 1:4
|
||||
x((k-1)*n/4+1:k*n/4) = x((k-1)*n/4+1:k*n/4) + d(k);
|
||||
y((k-1)*n/4+1:k*n/4) = y((k-1)*n/4+1:k*n/4) - d(k);
|
||||
z((k-1)*n/4+1:k*n/4) = z((k-1)*n/4+1:k*n/4) + d(k);
|
||||
end
|
||||
covareigen3( x, y, z );
|
35
linearalgebra/simulations/covareigenexamples.m
Normal file
35
linearalgebra/simulations/covareigenexamples.m
Normal file
@ -0,0 +1,35 @@
|
||||
scrsz = get( 0, 'ScreenSize' );
|
||||
set( 0, 'DefaultFigurePosition', [ scrsz(3)/2 scrsz(4)/2 scrsz(3)/2 scrsz(4)/2 ] );
|
||||
|
||||
% correlation coefficients:
|
||||
n = 10000;
|
||||
x = randn( n, 1 );
|
||||
f = figure( 1 );
|
||||
for r = 0.01:0.199:1
|
||||
fprintf( 'Correlation = %g\n', r );
|
||||
clf( f );
|
||||
y = r*x + sqrt(1-r^2)*randn( n, 1 );
|
||||
covareigen( x, y, 2, 5.0, 3.0 );
|
||||
key = waitforbuttonpress;
|
||||
end
|
||||
return
|
||||
|
||||
% two distributions:
|
||||
n = 10000;
|
||||
x1 = randn( n/2, 1 );
|
||||
y1 = randn( n/2, 1 );
|
||||
x2 = randn( n/2, 1 );
|
||||
y2 = randn( n/2, 1 );
|
||||
f = figure( 1 );
|
||||
pause( 'on' );
|
||||
for d = 0:1:5
|
||||
fprintf( 'Distance = %g\n', d );
|
||||
clf( f );
|
||||
d2 = d / sqrt( 2.0 );
|
||||
x = [ x1; x2 ];
|
||||
y = [ y1+d2; y2-d2 ];
|
||||
scrsz = get(0,'ScreenSize');
|
||||
covareigen( x, y, 1, 10.0, 7.0 );
|
||||
%key = waitforbuttonpress;
|
||||
pause( 1.0 );
|
||||
end
|
74
linearalgebra/simulations/matrix2dtrafos.m
Normal file
74
linearalgebra/simulations/matrix2dtrafos.m
Normal file
@ -0,0 +1,74 @@
|
||||
m = [ 1 0; 0 1];
|
||||
matrixbox( m );
|
||||
title( 'Identity' );
|
||||
waitforbuttonpress;
|
||||
|
||||
m = [ 2 0; 0 1];
|
||||
matrixbox( m );
|
||||
title( 'Scale x' );
|
||||
waitforbuttonpress;
|
||||
|
||||
m = [ 1 0; 0 2];
|
||||
matrixbox( m );
|
||||
title( 'Scale y' );
|
||||
waitforbuttonpress;
|
||||
|
||||
m = [ 2 0; 0 2];
|
||||
matrixbox( m );
|
||||
title( 'Scale both' );
|
||||
waitforbuttonpress;
|
||||
|
||||
m = [ -1 0; 0 1];
|
||||
matrixbox( m );
|
||||
title( 'Flip x' );
|
||||
waitforbuttonpress;
|
||||
|
||||
m = [ 1 0; 0 -1];
|
||||
matrixbox( m );
|
||||
title( 'Flip y' );
|
||||
waitforbuttonpress;
|
||||
|
||||
m = [ -1 0; 0 -1];
|
||||
matrixbox( m );
|
||||
title( 'Flip both' );
|
||||
waitforbuttonpress;
|
||||
|
||||
m = [ 1 0; 1 1];
|
||||
matrixbox( m );
|
||||
title( 'Shear x' );
|
||||
waitforbuttonpress;
|
||||
|
||||
m = [ 1 1; 0 1];
|
||||
matrixbox( m );
|
||||
title( 'Shear y' );
|
||||
waitforbuttonpress;
|
||||
|
||||
phi = 0.1667*pi;
|
||||
m = [ cos(phi) -sin(phi); sin(phi) cos(phi)];
|
||||
matrixbox( m );
|
||||
title( 'Rotate 30' );
|
||||
waitforbuttonpress;
|
||||
|
||||
phi = 0.333*pi;
|
||||
m = [ cos(phi) -sin(phi); sin(phi) cos(phi)];
|
||||
matrixbox( m );
|
||||
title( 'Rotate 60' );
|
||||
waitforbuttonpress;
|
||||
|
||||
phi = 0.5*pi;
|
||||
m = [ cos(phi) -sin(phi); sin(phi) cos(phi)];
|
||||
matrixbox( m );
|
||||
title( 'Rotate 90' );
|
||||
waitforbuttonpress;
|
||||
|
||||
phi = 0.75*pi;
|
||||
m = [ cos(phi) -sin(phi); sin(phi) cos(phi)];
|
||||
matrixbox( m );
|
||||
title( 'Rotate 135' );
|
||||
waitforbuttonpress;
|
||||
|
||||
phi = 1.0*pi;
|
||||
m = [ cos(phi) -sin(phi); sin(phi) cos(phi)];
|
||||
matrixbox( m );
|
||||
title( 'Rotate 180' );
|
||||
waitforbuttonpress;
|
24
linearalgebra/simulations/matrixbox.m
Normal file
24
linearalgebra/simulations/matrixbox.m
Normal file
@ -0,0 +1,24 @@
|
||||
function matrixbox( m )
|
||||
% visualizes the effect of a matrix m on a set of vectors forming a box
|
||||
% m: a 2x2 matrix
|
||||
|
||||
v = [ 0 1 1 0 0; 0 0 1 1 0];
|
||||
w = m*v;
|
||||
clf;
|
||||
hold on;
|
||||
%set(gca, 'Xtick', [], 'Ytick', [], 'box', 'off')
|
||||
% axis:
|
||||
plot( [-2 2], [0 0], 'k', 'LineWidth', 1 );
|
||||
plot( [0 0], [-2 2], 'k', 'LineWidth', 1 );
|
||||
% old box:
|
||||
plot( v(1,:), v(2,:), 'k', 'LineWidth', 1.0 )
|
||||
quiver( [v(1,1)], [v(2,1)], [v(1,3)], [v(2,3)], 1.0, 'k', 'LineWidth', 2.0 );
|
||||
scatter( [v(1,2)], [v(2,2)], 60.0, 'filled', 'k' );
|
||||
% transfomred box:
|
||||
plot( w(1,:), w(2,:), 'b', 'LineWidth', 2.0 )
|
||||
quiver( [w(1,1)], [w(2,1)], [w(1,3)], [w(2,3)], 1.0, 'b', 'LineWidth', 3.0 );
|
||||
scatter( [w(1,2)], [w(2,2)], 100.0, 'filled', 'b' );
|
||||
hold off;
|
||||
xlim( [ -2 2 ] );
|
||||
ylim( [ -2 2 ] );
|
||||
end
|
22
linearalgebra/simulations/plotvector.m
Normal file
22
linearalgebra/simulations/plotvector.m
Normal file
@ -0,0 +1,22 @@
|
||||
function plotvector( v, s, sp )
|
||||
% plot an arrow for the 2D-vector v
|
||||
% v: the 2D vector
|
||||
% s: a string passed to quiver for the color
|
||||
% sp: if this string is set it defines the color of some helper lines
|
||||
|
||||
if nargin < 2
|
||||
s = 'b';
|
||||
end
|
||||
quiver( [0.0], [0.0], [v(1)], [v(2)], 1.0, s );
|
||||
grid on;
|
||||
if nargin == 3
|
||||
hh = ishold;
|
||||
if ~hh
|
||||
hold on;
|
||||
end
|
||||
plot( [0.0 v(1) v(1)], [0.0 0.0 v(2)], sp );
|
||||
if ~hh
|
||||
hold off;
|
||||
end
|
||||
end
|
||||
end
|
24
linearalgebra/simulations/plotvector3.m
Normal file
24
linearalgebra/simulations/plotvector3.m
Normal file
@ -0,0 +1,24 @@
|
||||
function plotvector3( v, s, sp )
|
||||
% plot an arrow for the 3D-vector v
|
||||
% v: the 3D vector
|
||||
% s: a string passed to quiver for the color
|
||||
% sp: if this string is set it defines the color of some helper lines
|
||||
|
||||
if nargin < 2
|
||||
s = 'b';
|
||||
end
|
||||
quiver3( [0.0], [0.0], [0.0], [v(1)], [v(2)], [v(3)], 1.0, s );
|
||||
view( 42, 12 );
|
||||
grid on
|
||||
if nargin == 3
|
||||
hh = ishold;
|
||||
if ~hh
|
||||
hold on;
|
||||
end
|
||||
plot3( [v(1) v(1)], [v(2) v(2)], [0.0 v(3)], sp );
|
||||
plot3( [0.0 v(1) v(1)], [v(2) v(2) 0.0], [0.0 0.0 0.0], sp );
|
||||
if ~hh
|
||||
hold off;
|
||||
end
|
||||
end
|
||||
end
|
127
linearalgebra/simulations/spikesortingwave.m
Normal file
127
linearalgebra/simulations/spikesortingwave.m
Normal file
@ -0,0 +1,127 @@
|
||||
% generate spikes:
|
||||
n = 1000;
|
||||
misi = 0.01;
|
||||
isis = exprnd( misi, n, 1 );
|
||||
isis = isis + 0.01;
|
||||
spikes = cumsum( isis );
|
||||
p = rand( size( spikes ) );
|
||||
|
||||
% spike waveforms:
|
||||
dt = 0.0001;
|
||||
x = -0.01:dt:0.01;
|
||||
y1 = 2.0*exp( -(x-0.0003).^2/2.0/0.0005^2 ) - 1.4*exp( -(x-0.0005).^2/2.0/0.0005^2 );
|
||||
y2 = exp( -x.^2/2.0/0.002^2 ).*cos(2.0*pi*x/0.005);
|
||||
p12 = 0.5;
|
||||
|
||||
% voltage trace:
|
||||
noise = 0.2;
|
||||
t = 0:dt:spikes(end)+3.0*x(end);
|
||||
v = noise*randn( 1, length( t ) );
|
||||
for k = 1:length( spikes )
|
||||
inx = ceil( spikes(k)/dt );
|
||||
if p(k) < p12
|
||||
v(inx:inx+length(x)-1) = v(inx:inx+length(x)-1) + y1;
|
||||
else
|
||||
v(inx:inx+length(x)-1) = v(inx:inx+length(x)-1) + y2;
|
||||
end
|
||||
end
|
||||
|
||||
figure( 1 );
|
||||
clf;
|
||||
plot( t(t<1.0), v(t<1.0) );
|
||||
hold on;
|
||||
|
||||
% find peaks:
|
||||
thresh = 0.7;
|
||||
inx = find( v(2:end-1) > thresh & v(1:end-2)<v(2:end-1) & v(2:end-1) > v(3:end) ) + 1;
|
||||
spiket = t(inx);
|
||||
spikev = v(inx);
|
||||
tinx = inx;
|
||||
for k=1:2
|
||||
inx = find( ( spiket(2:end-1)-spiket(1:end-2)>0.005 | spikev(2:end-1) > spikev(1:end-2) ) & ( spiket(3:end)-spiket(2:end-1)>0.005 | spikev(2:end-1) > spikev(3:end) ) )+1;
|
||||
spiket = spiket(inx);
|
||||
spikev = spikev(inx);
|
||||
tinx = tinx(inx);
|
||||
end
|
||||
scatter( spiket(spiket<1.0), spikev(spiket<1.0), 100.0, 'r', 'filled' );
|
||||
%scatter( t(tinx), v(tinx), 100.0, 'r', 'filled' );
|
||||
hold off;
|
||||
|
||||
% spike waveform snippets:
|
||||
w = ceil( 0.005/dt );
|
||||
vs = [];
|
||||
for k=1:length(tinx)
|
||||
vs = [ vs; v(tinx(k)-w:tinx(k)+w-1) ];
|
||||
end
|
||||
ts = t(1:size(vs,2));
|
||||
ts = ts - ts(floor(length(ts)/2));
|
||||
figure( 2 );
|
||||
clf;
|
||||
hold on
|
||||
for k=1:size(vs,1)
|
||||
plot( ts, vs(k,:), '-b' );
|
||||
end
|
||||
hold off
|
||||
|
||||
% pca:
|
||||
cv = cov( vs );
|
||||
[ ev , ed ] = eig( cv );
|
||||
[d,dinx] = sort( diag(ed), 'descend' );
|
||||
% spectrum of eigenvalues:
|
||||
figure( 3 );
|
||||
clf;
|
||||
subplot( 4, 1, 1 );
|
||||
scatter( 1:length(d), d, 'b', 'filled' );
|
||||
% project onto eigenvectors:
|
||||
nx = vs * ev(:,dinx(1));
|
||||
ny = vs * ev(:,dinx(2));
|
||||
%scatter( nx, ny, 'b', 'filled', 'MarkerEdgeColor', 'white' );
|
||||
%hold on;
|
||||
|
||||
% features:
|
||||
subplot( 4, 2, 5 );
|
||||
plot( 1000.0*ts, ev(:,dinx(1)), 'g', 'LineWidth', 2 );
|
||||
subplot( 4, 2, 6 );
|
||||
plot( 1000.0*ts, ev(:,dinx(2)), 'r', 'LineWidth', 2 );
|
||||
|
||||
% clustering:
|
||||
%kx = kmeans( [ nx, ny ], 2 );
|
||||
% nx smaller or greater a threshold:
|
||||
kthresh = 1.6;
|
||||
kx = ones( size( vs, 1 ), 1 );
|
||||
kx(nx>kthresh) = 2;
|
||||
|
||||
subplot( 4, 1, 2 );
|
||||
scatter( nx(kx==1), ny(kx==1), 'g', 'filled', 'MarkerEdgeColor', 'white' );
|
||||
hold on;
|
||||
scatter( nx(kx==2), ny(kx==2), 'r', 'filled', 'MarkerEdgeColor', 'white' );
|
||||
hold off;
|
||||
|
||||
% show sorted spike waveforms:
|
||||
subplot( 4, 2, 7 );
|
||||
hold on
|
||||
kinx1 = find(kx==1);
|
||||
for k=1:length(kinx1)
|
||||
plot( 1000.0*ts, vs(kinx1(k),:), '-g' );
|
||||
end
|
||||
plot( 1000.0*x, y1, '-k', 'LineWidth', 2 );
|
||||
xlim( [ 1000.0*ts(1) 1000.0*ts(end) ] )
|
||||
hold off
|
||||
subplot( 4, 2, 8 );
|
||||
hold on
|
||||
kinx2 = find(kx==2);
|
||||
for k=1:length(kinx2)
|
||||
plot( 1000.0*ts, vs(kinx2(k),:), '-r' );
|
||||
end
|
||||
plot( 1000.0*x, y2, '-k', 'LineWidth', 2 );
|
||||
xlim( [ 1000.0*ts(1) 1000.0*ts(end) ] )
|
||||
hold off
|
||||
|
||||
% spike trains:
|
||||
figure( 1 );
|
||||
hold on;
|
||||
six1 = find( spiket(kinx1)<1.0 );
|
||||
scatter( spiket(kinx1(six1)), spikev(kinx1(six1)), 100.0, 'g', 'filled' );
|
||||
six2 = find( spiket(kinx2)<1.0 );
|
||||
scatter( spiket(kinx2(six2)), spikev(kinx2(six2)), 100.0, 'r', 'filled' );
|
||||
hold off;
|
11
linearalgebra/simulations/spiketime.m
Normal file
11
linearalgebra/simulations/spiketime.m
Normal file
@ -0,0 +1,11 @@
|
||||
p = 0.0;
|
||||
n=0;
|
||||
for k = 1:length( spikes )
|
||||
%a= 0.5*(spikes(k+1)+spikes(k));
|
||||
%fprintf( 'set label %d "$T_{%d}$" at %g, -0.5 center\n', k+2, k, a );
|
||||
%fprintf( 'set arrow %d from %g, 0.3 to %g, 0.3 heads\n', k+2, spikes(k), spikes(k+1) );
|
||||
%fprintf( '%g %d\n%g %d\n\n', p, n, spikes(k), n );
|
||||
fprintf( '%g %d\n', spikes(k), n+1 );
|
||||
n = n+1;
|
||||
p = spikes(k);
|
||||
end
|
Reference in New Issue
Block a user