Advertisement
cardel

Perceptron

Sep 4th, 2018
333
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.32 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. #Neurona
  23. def neurona(entrada, pesos, theta):
  24.     entradaNeta = np.dot(pesos,np.transpose(entrada))+theta
  25.     salida = signo(entradaNeta)
  26.     return salida
  27.    
  28. #Algoritmo Perceptron
  29. def algoritmoPerceptron(entrada, iteraciones,tasaAprendizaje):
  30.     #Error
  31.     evolucionDelError = np.array([])   
  32.    
  33.     #Generar pesos aleatorios entre -1 y 1
  34.     pesos = 2*np.random.rand(2)-1
  35.     theta = 2*rnd.random()-1
  36.     #Iniciamos con el primer patron
  37.     patron = 0
  38.    
  39.     #Obtenemos filas y columnas
  40.     filas = entrada.shape[0]
  41.     columnas = entrada.shape[1]
  42.    
  43.     #El primer criterio de parada es el número de iteraciones
  44.     for it in range(0,iteraciones):
  45.         error = 0
  46.         #entrada.shape[0] número de datos en la primera dimensión (filas)
  47.         #Probamos todas las entradas con los pesos
  48.         for i in range(0, filas):
  49.             entradaActual = entrada[i,0:2]
  50.             salidaDeseada = entrada[i,2]
  51.             salidaObtenida = neurona(entradaActual,pesos,theta)
  52.             #Calculamos el error cuadrático medio
  53.             error += math.pow(salidaDeseada - salidaObtenida, 2)
  54.        
  55.         error = error/2
  56.         evolucionDelError = np.append(evolucionDelError,error)
  57.        
  58.         #El segundo criterio de parada es si alcanzamos un error = 0
  59.         if(error==0):
  60.             break
  61.         else:
  62.             #Si hay error actualizamos los pesos con la regla del perceptrón
  63.                        
  64.             #Obtenemos la diferencia entre la salida esperada y un patron dado
  65.             entradaActual = entrada[patron,0:2]
  66.             salidaDeseada = entrada[patron,2]
  67.             salidaObtenida = neurona(entradaActual,pesos,theta)
  68.             diferencia = salidaDeseada - salidaObtenida
  69.  
  70.             #Se toma columnas-1, ya que la ultima columna es la salida
  71.             for j in range(0,columnas-1):
  72.                 pesos[j] = pesos[j] + tasaAprendizaje*diferencia*entradaActual[j]
  73.  
  74.             theta = theta + tasaAprendizaje*diferencia
  75.             #Ahora seguimos con el siguiente patrón de entrada
  76.             patron=patron+1
  77.            
  78.         #Si todos los patrones han sido probados, volvemos a empezar
  79.         if patron>=filas:
  80.             patron = 0
  81.        
  82.     return pesos, evolucionDelError,theta
  83.    
  84. #Tasa de aprendizaje
  85. tasaAprendizaje = 0.5
  86.  
  87. #patron deseado
  88. entradas = np.array([[-1,-1,-1],[-1,1,-1],[1,-1,-1],[1,1,1]])
  89.  
  90. #Iteraciones
  91. iteraciones = 200
  92.  
  93. pesos, evolucionDelError,theta = algoritmoPerceptron(entradas, iteraciones,tasaAprendizaje)
  94.  
  95. filas = entradas.shape[0]
  96. columnas = entradas.shape[1]
  97.  
  98. #Probamos los pesos entrenados
  99. for i in range(0, filas):
  100.     entradaActual = entradas[i,0:2]
  101.     salidaDeseada = entradas[i,2]
  102.     salidaObtenida = neurona(entradaActual,pesos,theta)
  103.     print("******************")
  104.     print("Entrada",entradaActual)
  105.     print("Salida Deseada",salidaDeseada)
  106.     print("Salida Obtenida",salidaObtenida)
  107.  
  108. print("Pesos",pesos)
  109. print("Error",evolucionDelError)
  110. #Pintamos la evolución del error
  111. figura = plt.figure()
  112. plt.title(u'Error de entrenamiento perceptrón')
  113. plt.xlabel('Iteraciones')
  114. plt.ylabel(u'Error cuadrático medio')
  115. plt.plot(range(1,evolucionDelError.shape[0]+1), evolucionDelError,'bo-')
  116. plt.grid(True)
  117. plt.xticks(range(1,evolucionDelError.shape[0]+1))
  118. plt.show()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement