L’algoritmo del percettrone: il codice
Questo è il codice Julia che realizza l’algoritmo di apprendimento di un percettrone (ovvero di quella che nel libro chiamiamo “rete neurale input/output”). Nel codice si usa un insieme di apprendimento con 40000 punti, un numero di epoche pari a 10 e un tasso di apprendimento pari a 0.01, ma è facile modificare questi valori per vedere gli effetti sul risultato ottenuto.
# Questa funzione genera un insieme di esempi di
# classificazione corretta, restituendo, per ciascun
# esempio, le coordinate del punto e la risposta corretta
# corrispondente al punto (1 se il punto è sotto la
# bisettrice, 0 altrimenti).
function inputset(nt)
x = zeros(nt)
y = zeros(nt)
g = zeros(nt)
for i in 1:nt
x[i] = rand()
y[i] = rand()
if (x[i] >= y[i])
g[i] = 1
else
g[i] = 0
end
end
return x,y,g
end
# Questa funzione esegue il processo di apprendimento
# descritto nella figura 42 del libro (ne indica il
# numero di epoche ed eta il tasso di correzione).
function learn(x,y,g,ne,eta)
w = zeros(3)
w[1] = rand()
w[2] = rand()
w[3] = rand()
for i in 1:ne
for j in 1:length(x)
eo = w[2]*x[j] + w[3]*y[j];
if (eo > w[1] && g[j] == 0)
w[1] = w[1]+eta
w[2] = w[2]-eta*x[j]
w[3] = w[3]-eta*y[j]
elseif (eo < w[1] && g[j] == 1)
w[1] = w[1]-eta
w[2] = w[2]+eta*x[j]
w[3] = w[3]+eta*y[j]
end
end
end
return w
end
# Creiamo 40000 esempi
x,y,g = inputset(40000)
# Educhiamo la rete per mille epoche e con tasso di correzione
# piuttosto elevato
w = learn(x,y,g,1000,0.01)
# Se la rete ha appreso la bisettrice, allora w[1] è circa
# uguale a 0 e w[2] è circa uguale a -w[3]
println(w)
