# Función AND # Entradas p1 = "0 0 1 1" q1 = "0 1 0 1" p = np.matrix(p1 + ";" + q1) # Objetivos t1 = "0 0 0 1" t = np.matrix(t1) print("\n" + generar_banner("Vectores(p) y objetivos(t)") + "\n") for i in range(p.shape[1]): print(" ", p[:,i].tolist(), "=>", t[:,i]) # Perceptron perceptron = Perceptron(p, t) # Entrenar print("\n" + generar_banner("Entrenamiento del perceptrón") + "\n") perceptron.entrenar(lr=0.2, debug=True) # Clasificar vectores mediante perceptron entrenado print("\n" + generar_banner("Clasificar con perceptrón") + "\n") for i in range(p.shape[1]): y = perceptron.simular(p[:,i]) print(" ", p[:,i].tolist(), "=>", y) print() # Representar gráficamente perceptron.representar()
p1 = "0 0 1 1" q1 = "0 1 0 1" p = np.matrix(p1 + ";" + q1) # Objetivos t1 = "0 1 1 0" t = np.matrix(t1) print("\n" + generar_banner("Vectores(p) y objetivos(t)") + "\n") for i in range(p.shape[1]): print(" ", p[:, i].tolist(), "=>", t[:, i]) # Perceptron perceptron = Perceptron(p, t) # Entrenar (1000 épocas) debug = False if debug: print("\n" + generar_banner("Entrenamiento del perceptrón") + "\n") perceptron.entrenar(lr=0.2, debug=debug) # Clasificar vectores mediante perceptron entrenado print("\n" + generar_banner("Clasificar con perceptrón") + "\n") for i in range(p.shape[1]): y = perceptron.simular(p[:, i]) print(" ", p[:, i].tolist(), "=>", y) print() # Representar gráficamente perceptron.representar()
class App: def __init__(self, n=100, w=500, h=500): self.n = n self.w = w self.h = h self.puntos = [] self.perceptron = Perceptron(2, 1) master = Tk() self.l = Canvas(master, width=self.w, height=self.h) self.entrenando = 0 self.indice_equivocados = 0 def click(self, event): """ Metodo que se llama como callback al ocurrir un evento de click en el canvas, este realiza una ronda de entrenamiento con uno de los puntos. """ entrenamiento_actual = self.puntos[self.entrenando] entradas = [entrenamiento_actual.x, entrenamiento_actual.y] objetivo = entrenamiento_actual.val self.perceptron.entrenar(entradas, objetivo) entrenamiento_actual.mostrar() self.check(entrenamiento_actual) self.entrenando += 1 if self.entrenando == len(self.puntos): if self.indice_equivocados > 0: self.entrenando = 0 self.indice_equivocados = 0 print( "Se llego al final de la primer vuelta, se vuelve a iniciar porque se hicieron ajustes." ) else: print( "Se llego al final de la vuelta sin ningun error, se termina el programa, los pesos son los siguientes" ) print(self.perceptron) sys.exit(0) def circulo(self, l, cx, cy, r, color="white"): """ Metodo que dibuja un circulo con centro en cx y cy y radio r """ l.create_oval(cx - r, cy - r, cx + r, cy + r, fill=color) def check(self, pt): """ Permite visualizar que datos fueron estimados correctamente por el perceptron. colorea un circulo interno en los circulos ya existentes, este sera verde si la estimacion es correcta, y rojo si la estimacion es incorrecta. """ entradas = [pt.x, pt.y] objetivo = pt.val estimacion = self.perceptron.estimar(entradas) if estimacion == objetivo: self.circulo(self.l, pt.x, pt.y, 5, "green") else: self.circulo(self.l, pt.x, pt.y, 5, "red") self.indice_equivocados += 1 def main(self): self.l.configure(background='white') self.l.bind("<Button-1>", self.click) self.l.pack() for i in range(self.n): pt = Punto(self.l, self.w, self.h) self.puntos.append(pt) pt.mostrar() self.check(pt) mainloop()