Advertisement
cardel

Untitled

Sep 5th, 2018
591
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.01 KB | None | 0 0
  1. # encoding: utf-8
  2. # Autor: Carlos Andres Delgado
  3. # Algoritmo Perceptron
  4.  
  5. import numpy as np
  6. import matplotlib.pyplot as plt
  7. import math
  8. import random as rnd
  9.  
  10. #Función signo
  11. def signo(x):
  12.         if(x>0):
  13.                 result = 1
  14.         elif (x<0):
  15.                 result = -1
  16.         else:
  17.                 result = 0
  18.                                
  19.         return result
  20.  
  21.  
  22.    
  23. #Red neuronal
  24. def redNeuronal(entrada, matrizPesos, theta):
  25.     entradaNetaN1 = np.dot(matrizPesos[0,:],np.transpose(entrada))+theta[0]
  26.     SalidaN1 = signo(entradaNetaN1)
  27.     entradaNetaN2 = np.dot(matrizPesos[1,:],np.transpose(entrada))+theta[1]
  28.     SalidaN2 = signo(entradaNetaN2)
  29.    
  30.     return np.array([SalidaN1, SalidaN2])
  31.    
  32. #Algoritmo Perceptron
  33. def algoritmoPerceptron(entrada, iteraciones,tasaAprendizaje):
  34.     #Error
  35.     evolucionDelError = np.array([])   
  36.    
  37.     #Generar pesos aleatorios entre -1 y 1
  38.     pesos = 2*np.random.rand(2,2)-1
  39.     theta = 2*np.random.rand(2)-1
  40.     #Iniciamos con el primer patron
  41.     patron = 0
  42.    
  43.     #Obtenemos filas y columnas
  44.     filas = entrada.shape[0]
  45.     columnas = entrada.shape[1]
  46.    
  47.     #El primer criterio de parada es el número de iteraciones
  48.     for it in range(0,iteraciones):
  49.         error = 0
  50.         #entrada.shape[0] número de datos en la primera dimensión (filas)
  51.         #Probamos todas las entradas con los pesos
  52.         for i in range(0, filas):
  53.             entradaActual = entrada[i,0:2]
  54.             salidaObtenida = redNeuronal(entradaActual,pesos,theta)
  55.             #Calculamos el error cuadrático medio
  56.            
  57.             salidaDeseadaN1 = entrada[i,2]
  58.             salidaDeseadaN2 = entrada[i,3]
  59.            
  60.             error += math.pow(salidaDeseadaN1 - salidaObtenida[0], 2)
  61.             error += math.pow(salidaDeseadaN2 - salidaObtenida[1], 2)
  62.        
  63.         error = error/2
  64.         evolucionDelError = np.append(evolucionDelError,error)
  65.        
  66.         #El segundo criterio de parada es si alcanzamos un error = 0
  67.         if(error==0):
  68.             break
  69.         else:
  70.             #Si hay error actualizamos los pesos con la regla del perceptrón
  71.                        
  72.             #Obtenemos la diferencia entre la salida esperada y un patron dado
  73.             entradaActual = entrada[patron,0:2]
  74.  
  75.             salidaObtenida = redNeuronal(entradaActual,pesos,theta)
  76.             #Calculamos el error cuadrático medio
  77.            
  78.             salidaDeseadaN1 = entrada[patron,2]
  79.             salidaDeseadaN2 = entrada[patron,3]
  80.            
  81.             diferenciaN1 = salidaDeseadaN1 - salidaObtenida[0]
  82.             diferenciaN2 = salidaDeseadaN2 - salidaObtenida[1]
  83.  
  84.             #Se toma columnas-1, ya que la ultima columna es la salida
  85.             for j in range(0,columnas-2):
  86.                 pesos[0][j] = pesos[0][j] + tasaAprendizaje*diferenciaN1*entradaActual[j]
  87.  
  88.                 pesos[1][j] = pesos[1][j] + tasaAprendizaje*diferenciaN2*entradaActual[j]
  89.  
  90.             theta[0] = theta[0] + tasaAprendizaje*diferenciaN1
  91.             theta[1] = theta[1] + tasaAprendizaje*diferenciaN2
  92.             #Ahora seguimos con el siguiente patrón de entrada
  93.             patron=patron+1
  94.            
  95.         #Si todos los patrones han sido probados, volvemos a empezar
  96.         if patron>=filas:
  97.             patron = 0
  98.        
  99.     return pesos, evolucionDelError,theta
  100.    
  101. #Tasa de aprendizaje
  102. tasaAprendizaje = 0.2
  103.  
  104. #patron deseado, primera N1: AND, N2, OR
  105. entradas = np.array([[-1,-1,-1,-1],[-1,1,-1,-1],[1,-1,-1,-1],[1,1,1,1]])
  106.  
  107. #Iteraciones
  108. iteraciones = 200
  109.  
  110. pesos, evolucionDelError,theta = algoritmoPerceptron(entradas, iteraciones,tasaAprendizaje)
  111.  
  112. filas = entradas.shape[0]
  113. columnas = entradas.shape[1]
  114.  
  115. #Probamos los pesos entrenados
  116. for i in range(0, filas):
  117.     entradaActual = entradas[i,0:2]
  118.     salidaDeseadaN1 = entradas[i,2]
  119.     salidaDeseadaN2 = entradas[i,3]
  120.    
  121.     salidaObtenida = redNeuronal(entradaActual,pesos,theta)
  122.     print("******************")
  123.     print("Entrada",entradaActual)
  124.     print("Salida Deseada ",np.array(entradas[i,2:4]))
  125.     print("Salida Obtenida",salidaObtenida)
  126.  
  127. print("Pesos",pesos)
  128. print("Error",evolucionDelError)
  129. #Pintamos la evolución del error
  130. figura = plt.figure()
  131. plt.title(u'Error de entrenamiento perceptrón')
  132. plt.xlabel('Iteraciones')
  133. plt.ylabel(u'Error cuadrático medio')
  134. plt.plot(range(1,evolucionDelError.shape[0]+1), evolucionDelError,'bo-')
  135. plt.grid(True)
  136. plt.xticks(range(1,evolucionDelError.shape[0]+1))
  137. plt.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement