Un truc absolument fascinant que je fais ces temps-ci, ce sont des réseaux de neurones. Je suis très chanceux: Sylvain Chartier, un prof du département de psychologie, a été assez impressionné par mon travail dans son cours de perception pour me proposer de me guider dans la découverte de réseaux cognitifs (il faut dire que je lui avais pondu un réseau d’environ 3500 neurones, un truc incalculable). Cette semaine, je fais du Hopfield, et la semaine dernière, c’était un réseau Adaline.
Je vais peut-être migrer vers Mathématica, mais comme le logiciel de Wolfram prenait trop de place pour mon Eee PC, je fonctionne encore sur Maxima, un équivalent open-source beaucoup plus léger.
Bref, voici mon script Adaline en Maxima, avec quelques fonctions graphiques pour représenter le résultat. Dès que je l’aurai fait, je vous montrerai mon Hopfield.
load(draw);
f1(a,b,c) := a-2*b+c;
tf(a,b,c) := if f1(a,b,c) > 0 then 1 else -1;
matsize:3;
r[x,y]:=random(1.0);
b:random(1.0);
w:genmatrix(r,3,1);
alpha:0.1;
bstep:0.1;
wchgtol:0.05;
lgestwchg:1;
for i: 1 while lgestwchg > wchgtol do (
wold:w,
for j: 0 thru 1.0 step bstep do
for k: 0 thru 1.0 step bstep do
for l: 0 thru 1.0 step bstep do (
x:matrix([j,k,l]),
t:tf(j,k,l),
y:b+(x.w),
dif:alpha*(t-y),
b:b+dif,
maxdif:0,
for m:1 thru matsize do if maxdif < x[1,m]*dif then maxdif:x[1,m]*dif,
w:w+transpose(x)*dif
),
lwchg: 0,
for j:1 thru matsize do if lwchg < abs(w[j,1]-wold[j,1]) then lwchg:abs(w[j,1]-wold[j,1]),
display(lwchg),
lgestwchg:lwchg );
redfn(a,c,d):= b+matrix([a,c,d]).w;
display(w);
draw3d( explicit(tf(u,v,1),u,-1,1,v,-1,1),explicit(redfn(u,v,1),u,-1,1,v,-1,1), columns=2);
draw3d( explicit(tf(u,1,v),u,-1,1,v,-1,1),explicit(redfn(u,1,v),u,-1,1,v,-1,1), columns=2);
draw3d( explicit(tf(1,u,v),u,-1,1,v,-1,1),explicit(redfn(1,u,v),u,-1,1,v,-1,1), columns=2);