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