Advertisement
cardel

Untitled

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