View file src/neur/abdi-mhal.ijs - Download

NB. D'après "Les réseaux de neurones" par Hervé Abdi
NB. Chapitre III Les mémoires hétéro-associatives linéaires

NB. Utilitaires

and =: *.
or =: +.
not =: -.

transpose =: |:
extprod =: */
matprod =: +/ . *

inv =: %.
id =: (= / ~) @ i.

avg =: 3 : 0
 (+/ y) % #y
)

pavg =: 4 : 0
 +/ y * x % +/ x
)

diag =: 3 : 0
 y * id # y
)

NB. Puissance d'une matrice
mpow =: 4 : 0
 A =. x
 n =. y
 B =. id #A
 for. i. n do.
  B =. B matprod A
 end.
 B
)

NB. Calcul des valeurs et vecteurs propres d'une matrice par la méthode de la puissance itérée et de la déflation
NB. Référence : 
NB.  http://www.bibmath.net/dico/index.php?action=affiche&quoi=./m/methodepuissance.html
NB.  http://log.chez.com/text/math/methodepuissance.pdf
NB.  http://www.normalesup.org/~pastre/meth-num/MN/9-val-pro/cours-valeurspropres.pdf
NB.  http://log.chez.com/text/math/cours-valeurspropres.pdf

NB. puissance A = l; u; i : l = valeur propre, u = vecteur propre, i = nombre d'itérations
puissance =: 3 : 0
 A =. y
 n =. #A
 NB. u =. 1 , (n-1) $ 0
 u =. (?. n $ 1000) % 1000
 u =. u % (u matprod u)^0.5
 i =. 0
 while. (i < 10000)
 do.
  i =. i + 1
  u1 =. u
  u =. A matprod u
  u =. u % (u matprod u)^0.5
  d =. u - u1
  if. (d matprod d) < 1e_30
  do. break.
  end.
 end.
 NB. l =. avg (A matprod u) % u
 l =. (u * u) pavg (A matprod u) % u
 l; u; i
)

NB. deflation A = l; u : l = valeurs propres, u = vecteurs propres
deflation =: 3 : 0
 A =. y
 NB. B = transpose A
 n =. #A
 l =. 0 $ 0
 u =. (n,0) $ 0
 for. A
 do.
  NB. echo 'A='; A
  lu1 =. puissance A
  NB. echo lu1
  l1 =. > 0 { lu1
  u1 =. > 1 { lu1
  l =. l , l1
  u =. u ,. u1
  lu2 =. puissance (transpose A)
  l2 =. > 0 { lu2
  u2 =. > 1 { lu2
  A =. A - l1 * u1 extprod u2 % u1 matprod u2
  NB. B =. B - l1 * u2 extprod u1 % u2 matprod u1
 end.
 l ; u
)

NB. Décomposition en valeurs singulières

NB. dvs A = D; P; Q tels que A = P D Q^T
dvs =: 3 : 0 
 A =. y
 if. (0 { $ A) <: 1 { $ A do.
  LP =. deflation A matprod transpose A
  L =. > 0 { LP
  P =. > 1 { LP
  D =. (diag L)^0.5
  Q =. (transpose A) matprod P matprod inv D
 else.
  MQ =. deflation (transpose A) matprod A
  M =. > 0 { MQ
  Q =. > 1 { MQ
  D =. (diag M)^0.5
  P =. A matprod Q matprod inv D
 end.
 D ; P ; Q
)

NB. pseudoinv A = A+ = Q D^-1 P^T ; A A+ A = A 
pseudoinv =: 3 : 0
 A =. y
 DPQ =. dvs A
 D =. > 0 { DPQ
 P =. > 1 { DPQ
 Q =. > 2 { DPQ
 Q matprod (inv D) matprod transpose P
)

NB. Exemples :
NB.  A =: 3 2 $ 1.1547 _1.1547 _1.0774 0.0774 _0.0774 1.0774
NB.  A =: 3 2 $ 2 0 0 _3 0 0
NB.  A =: 3 2 $ 1 2 3 4 5 6

NB. Test :
NB.  DPQ =: dvs A
NB.  D =: > 0 { DPQ
NB.  P =: > 1 { DPQ
NB.  Q =: > 2 { DPQ
NB.  A1 =: P matprod D matprod transpose Q
NB.  E1 =: A1 - A
NB.  echo 'E1'; E1

NB.  iA =: pseudoinv A
NB.  A2 =: A matprod iA matprod A
NB.  E2 =: A2 - A
NB.  echo 'E2'; E2


NB. Mémoire hétéro-associative linéaire

NB. Stimuli (entrées) : Chiffres sur 3x5 pixels

x0a =: 0 1 0  1 0 1  1 0 1  1 0 1  0 1 0
x0b =: 0 0 0  0 1 0  1 0 1  1 0 1  0 1 0

x1a =: 0 0 1  0 1 1  1 0 1  0 0 1  0 0 1
x1b =: 0 1 0  0 1 0  0 1 0  0 1 0  0 1 0

x2a =: 1 1 0  0 0 1  0 1 0  1 0 0  1 1 1
x2b =: 1 1 0  0 0 1  0 0 1  1 1 0  1 1 1

x3a =: 1 1 0  0 0 1  0 1 0  0 0 1  1 1 0
x3b =: 1 1 0  0 0 1  1 1 0  0 0 1  1 1 0

x4a =: 1 0 0  1 0 1  1 1 1  0 0 1  0 0 1
x4b =: 0 0 1  0 1 1  1 1 1  0 0 1  0 0 1

x5a =: 1 1 1  1 0 0  1 1 0  0 0 1  1 1 0
x5b =: 1 1 1  1 0 0  0 1 0  0 0 1  1 1 0

x6a =: 0 1 1  1 0 0  1 1 0  1 0 1  0 1 0
x6b =: 0 1 1  1 0 0  1 1 0  1 0 1  1 1 0

x7a =: 1 1 1  0 0 1  0 1 1  0 0 1  0 0 1
x7b =: 1 1 1  0 0 1  1 1 1  0 0 1  0 0 1

x8a =: 0 1 0  1 0 1  0 1 0  1 0 1  0 1 0
x8b =: 1 1 1  1 0 1  1 1 1  1 0 1  1 1 1

x9a =: 0 1 0  1 0 1  0 1 1  0 0 1  0 1 0
x9b =: 0 1 0  1 0 1  0 1 1  0 0 1  1 1 0

NB. Réponses (sorties)
o0 =: 1 0 0 0 0 0 0 0 0 0
o1 =: 0 1 0 0 0 0 0 0 0 0
o2 =: 0 0 1 0 0 0 0 0 0 0
o3 =: 0 0 0 1 0 0 0 0 0 0
o4 =: 0 0 0 0 1 0 0 0 0 0
o5 =: 0 0 0 0 0 1 0 0 0 0
o6 =: 0 0 0 0 0 0 1 0 0 0
o7 =: 0 0 0 0 0 0 0 1 0 0
o8 =: 0 0 0 0 0 0 0 0 1 0
o9 =: 0 0 0 0 0 0 0 0 0 1

NB. Matrice des stimuli 
X =: x0a ,. x0b ,. x1a ,. x1b ,. x2a ,. x2b ,. x3a ,. x3b ,. x4a ,. x4b ,. x5a ,. x5b ,. x6a ,. x6b ,. x7a ,. x7b ,. x8a ,. x8b ,. x9a ,. x9b

NB. Matrice des réponses théoriques 
T =: o0 ,. o0 ,. o1 ,. o1 ,. o2 ,. o2 ,. o3 ,. o3 ,. o4 ,. o4 ,. o5 ,. o5 ,. o6 ,. o6 ,. o7 ,. o7 ,. o8 ,. o8 ,. o9 ,. o9

Wa =: (x0a */ o0) + (x0b */ o0) + (x1a */ o1) + (x1b */ o1) + (x2a */ o2) + (x2b */ o2) + (x3a */ o3) + (x3b */ o3) + (x4a */ o4) + (x4b */ o4) + (x5a */ o5) + (x5b */ o5) + (x6a */ o6) + (x6b */ o6) + (x7a */ o7) + (x7b */ o7) + (x8a */ o8) + (x8b */ o8) + (x9a */ o9) + (x9b */ o9)

NB. Décomposition en valeurs singulières de la matrice des stimuli
DPQ =: dvs X
D =: > 0 { DPQ
P =: > 1 { DPQ
Q =: > 2 { DPQ

Lambda =: D matprod D

X1 =: P matprod D matprod transpose Q

NB. Valeurs optimales pour les poids : 
NB. W^T X = T
NB. W^T = T X+ avec X+ = Q D^-1 P^T
NB. W = X+^T T^T = P D^-1 Q^T T^T
W =: P matprod (inv D) matprod (transpose Q) matprod (transpose T)

NB. Calcul des poids par itération de la règle de Widrow-Hoff

NB. Matrice des intensités des synapses (poids) initiale nulle 
NB. W0 =: ((? 1000+0*W) % 500)-1
W0 =: 0*W
WT0 =: 0 * transpose Wa

eta =: 0.01

NB. step =: 3 : 0
NB.  W =. y
NB.  W =. W + eta * W matprod (transpose T - (transpose W) matprod X)
NB.  W
NB. )

NB. Règle de Widrow-Hoff
step =: 3 : 0
 WT =. y
 WT =. WT + eta * (T - WT matprod X) matprod transpose X
 WT
)

WT1 =: step WT0
WT2 =: step WT1
WT3 =: step WT2

Wt =: 3 : 0
 I =. id #D
 W =. T matprod Q matprod ((inv D) matprod (I - (I - eta * Lambda) mpow y)) matprod transpose P
)

echo 1e_20<(WT3-Wt 3)^2
echo ' '
echo 1e_20<((Wt 100000) - transpose W)^2