Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Practica 02 Morales Pedro PDF
Practica 02 Morales Pedro PDF
INTELIGENCIA ARTIFICAL II
PRACTICA 02
Código: 216787639
Sección: D02
Profesor: Julio Esteban Valdés López
ÍNDICE ................................................................................................................................... 2
INTRODUCCIÓN .................................................................................................................. 3
PERCEPTRON SIMPLE ....................................................................................................... 2
Código.......................................................................................................................................... 2
Grafica ......................................................................................................................................... 5
CONCLUSIÓN ...................................................................................................................... 7
INTRODUCCIÓN
Código
import matplotlib.pyplot as plt
import numpy as np
from matplotlib.widgets import CheckButtons
from matplotlib.widgets import Button
from matplotlib.widgets import TextBox
global stop_points
global X1
global X2
global Y_aux
global X
global Y
global epochs
global epochData
global l
global larningData
X1 = []
X2 = []
Y_aux = []
X = []
Y = []
stop_points = False
epochs = "50"
epochData = 50
l = "0.1"
larningData = 0.1
#mouse click function to store coordinates and plot vertical red line
def onclick(event):
# Only use event within the axes.
global X1
global X2
global Y_aux
global X
global Y
global stop_points
elif not(stop_points):
ix, iy = event.xdata, event.ydata
X1.append((ix))
X2.append((iy))
Y.append(1)
ax1.plot(ix,iy, marker = "o", color = "blue")
fig.canvas.draw_idle()
class Perceptron(object):
ind = 0
def __init__(self, n_input, learning_rate):
self.w = -1 + 2 * np.random.rand(n_input)
self.b = -1 + 2 * np.random.rand()
self.eta = learning_rate
class Start(object):
def start(self, event):
global stop_points
global X
global Y
global epochData
global larningData
X = np.array([X1,X2])
print(Y)
neuron = Perceptron(2, larningData)
if buttonS.label.get_text() == 'Iniciar':
buttonS.label.set_text("Agregar puntos")
stop_points = True
neuron.fit(X, Y, epochData)
print(neuron.predict(X))
neuron.draw_2d(neuron, X, Y, );
elif buttonS.label.get_text() == 'Agregar puntos':
buttonS.label.set_text("Iniciar")
stop_points = False
callback = Start()
#plots the graph
x = range(-1,2)
y = range(-1,2)
def submit_e(text):
global epochData
global epochs
try:
epochData = eval(text)
if epochData < 1:
epochData = 1
text_box_e.set_val("1")
except:
epochData = 50
text_box_e.set_val("50")
def submit_l(text):
global larningData
global l
try:
larningData = eval(text)
if larningData < 0:
larningData = 0.1
text_box_l.set_val("0.1")
except:
larningData = 0.1
text_box_l.set_val("0.1")
Grafica
CONCLUSIÓN
Finalmente, para concluir considero que esta práctica resulto algo complicada, porque si
bien el algoritmo del perceptrón es a priori bastante sencillo los requisitos de la interfaz
subieron considerablemente el nivel de la práctica. Para poder resolverla tuve que utilizar la
librería de Python matplotlib y además un evento en Python para identificar cuando el
usuario hacía clic. Teniendo esto lo demás resulto sencillo, aunque la única desventaja que
había es que matplotlib no te permite configurar todo lo que quieras de sus widgets y estas
muy sujeto a lo que te ofrece. Sin embargo, en lugar de usar otra herramienta decidí
aprovechar todas las ventajas que esta daba en la creación de graficas dinámicas. En cuanto
al algoritmo del perceptrón lo cierto es que simplemente había que almacenar los datos que
las coordenadas me daban y después de obtener esos datos, generaba 2 vectores, el primer
vector tenía las entradas, es decir las coordenadas de cada punto y el segundo las salidas
deseadas es decir 0 o 1 de acuerdo con el color. Y finalmente mandaba dichos parámetros
al algoritmo y usando la librería numpy se volvería sencillo operar sobre vectores. Al final
simplemente si los puntos son separables la línea se dibuja con bastante precisión, pero
cuando no es así el algoritmo sigue hasta terminar las épocas y encontrarse con que
gráficamente no son separables por un solo hiperplano.