Perceptrón
El perceptrón de Rosenblatt es una unidad de cómputo para encontrar el hiperplano que separa linealmente dos conjuntos. En el siguiente ejemplo vamos a separar los conjuntos X e Y
In [3]: from pylab import *
In [42]: X
Out[42]:
array([[ 0.2875059 , 1.02131739, 0.9679371 , 0.72087867, 0.28667508],
[ 2.10649233, 2.87852222, 2.93830231, 3.06447578, 3.43397669]])
In [43]: Y
Out[43]:
array([[ 0.83189487, 1.49862816, 0.80882769, 0.88937322, 0.59564973],
[ 1.00970206, 0.96031873, 1.38337999, 1.17305337, 1.13774454]])
Lo que vamos a hacer es agregar el input dummy en cada conjunto así como la categoría (en forma bipolar) a la que pertenecer y juntarlo todo en un solo conjunto
In [44]: E
Out[44]:
array([[ 1. , 0.2875059 , 2.10649233, 1. ],
[ 1. , 1.02131739, 2.87852222, 1. ],
[ 1. , 0.9679371 , 2.93830231, 1. ],
[ 1. , 0.72087867, 3.06447578, 1. ],
[ 1. , 0.28667508, 3.43397669, 1. ],
[ 1. , 0.83189487, 1.00970206, -1. ],
[ 1. , 1.49862816, 0.96031873, -1. ],
[ 1. , 0.80882769, 1.38337999, -1. ],
[ 1. , 0.88937322, 1.17305337, -1. ],
[ 1. , 0.59564973, 1.13774454, -1. ]])
Después definiremos nuestro perceptrón con la siguiente firma (Conj1, Conj2, iteraciones, constante aprendizaje)
In [46]: def perceptron(X,Y,n,eta,v=True):
""" Aquí va la implementación vista en clase o bien la del Rojas"""
return w
Ejecutamos el algoritmo del perceptron con 8 iteraciones y una constante de 0.5
In [47]: w = perceptron(X,Y,8,0.5)
Y obtenemos esto
In [48]: w
Out[48]: array([-0.43888895, -0.38130939, 0.34128665])
Este resultado final contiene el sesgo b en la primer entrada y el primer y segundo pesos en las siguientes entradas, es decir, algo de la forma
(b, w1, w2)
Para comprobar que efectivamente los estímulos se clasificaron bien, ejecutamos el siguiente for
In [49]: for e in E:
p = e[:-1]
s = e[-1]
print sign(w.T.dot(p)), s
1.0 1.0
1.0 1.0
1.0 1.0
1.0 1.0
1.0 1.0
-1.0 -1.0
-1.0 -1.0
-1.0 -1.0
-1.0 -1.0
-1.0 -1.0
Donde de un lado, el izquierdo, vemos lo que obtenemos y del derecho lo que debimos haber obtenido.
¿De qué lado cae el vector (1,3)?
In [52]: sign(w.T.dot(array( [1,1,3] )))
Out[52]: 1.0
¿De qué lado cae el vector (0.8, 1)?
In [57]: sign(w.T.dot(array( [1,0.8,1.0] )))
Out[57]: -1.0
Busquen estos puntos en la siguiente figura