Encontrar os pesos e bias em rede neural monocamada capaz de classificar 0 e X conforme diagrama baixo :
Como o exercicio especifica uma única saída, concluo que de todo o universo de possibilidades, apenas estas duas (acima) devem ser válidas , ou seja saída da rede (y) igual a 1.
A partir disto estabeleci uma matriz, cujos elementos representa 2 ^ n, onde n é o nr. no array.
Temos então que 'X' é representado por 2^0 + 2^6 + 2^12 + 2^18 + 2^24 + 2^4 + 2^8 + 2^16 + 2^20, que em decimal é o vetor 18.157.905
'o' é representado por 2^1 + 2^2 + 2^3 + 2^5 + 2^10 + 2^15 + 2^9 + 2^14 + 2^19 +2^21 + 2^22 + 2^23, que em decimal é o vetor 15.255.086.
Ou seja de todos o vetores de teste, de 0 até 2^25 ( 33.554.432), apenas os dois acima devem ter como resultado na rede neural y =1, para os demais y =-1.
Rodando o programa abaixo (feito em python), obtemos a seguinte matriz de peso (w) e um bias (b) igual a -33.554.428
=======================================
#Variable definitionx = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
wold = wnew = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
bold = bnew = 0
byte_dec = 1.0
size = 25 #size of array (n *n)
#Hebb correction
size = 25 #size of array (n *n)
#Hebb correction
def hebb_correction(x):
global wold
global wnew
global bnew
global bold for count in range(0,size):
wnew[count] = wold[count] + x[count] * y #correct weight
wold[count] = wnew[count] #
bnew = bold + y #correct bias
bold = bnew return
#Start
#Start
i = 0
while (i<2**size):>
byte =" i">> bit_pos
byte_dec = float(byte) if (byte_dec/2 -int(byte_dec/2)) > 0 : x[bit_pos] = 1
else: x[bit_pos] = -1
if i == 15255086 or i ==18157905: #test vectors which have y =1
if i == 15255086 or i ==18157905: #test vectors which have y =1
y = 1 #assign y = 1
else : y = -1 #if not assign y = -1
hebb_correction(x) #call funtion to correct weight and bias
i = i+1
print bnew
print wnew




