Advertisement
cardel

Untitled

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