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