Petit exemple de Percepton - Y.C

In [160]:
%matplotlib inline
from numpy import *

Perceptron simple

In [161]:
X = random.randn(100,2)
In [163]:
# Avec 'list comprehension':
y = array([1 if dot(ex,[3,2])>0 else -1 for ex in X])

# ou la meme chose avec une boucle for:
# y = []
# for ex in X:
#     if dot(ex,[3,2]) > 0:
#         y.append(1)
#     else:
#         y.append(-1)
In [164]:
X[:10] , y[:10]
Out[164]:
(array([[-1.10337514,  0.56440917],
        [-1.19692193,  0.82374498],
        [ 0.99301882,  0.10008746],
        [ 0.57469877, -0.65705228],
        [ 1.27769748, -0.71771736],
        [ 0.68261423, -1.50562944],
        [-0.0973167 ,  1.55392975],
        [ 1.48548657, -1.18423599],
        [ 2.63523079, -0.07771188],
        [-1.86743191,  0.75247071]]),
 array([-1, -1,  1,  1,  1, -1,  1,  1,  1, -1]))
In [165]:
def affiche(X,y):
    Xpos = X[y > 0]
    Xneg = X[y < 0]

    import matplotlib.pyplot as plt
    plt.scatter(Xpos[:,0],Xpos[:,1],c='blue')
    plt.scatter(Xneg[:,0],Xneg[:,1],c='red')

affiche(X,y)
In [166]:
def phi(ex):
    return ex
In [167]:
def perceptron(T):
    nexs  = len(X)
    eta   = 0.2
    natts = len(phi(X[0]))

    w = zeros( natts )
    for k in range(T):
        i = random.randint(0,nexs)
        ex= phi( X[i] )
        if y[i]*dot(w,ex) <= 0:
            w = w + eta*y[i]*ex
            print "erreur de classif"
        else:
            print "ok"

    return w
In [168]:
perceptron(30)
erreur de classif
ok
ok
erreur de classif
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok
ok

Out[168]:
array([ 0.28215454,  0.12848044])

Perceptron avec transformation des donnees

In [169]:
def phi(ex):
    return array( [1.0] + list(ex) + [i*j for i in ex for j in ex] )

phi([2,3])
Out[169]:
array([ 1.,  2.,  3.,  4.,  6.,  6.,  9.])
In [170]:
# je definis un cercle de rayon 1. Tous les exemples dans le cercle sont positifs.
y = array([1 if (ex[0]**2+ex[1]**2) < 1 else -1 for ex in X])
In [171]:
affiche(X,y)
In [173]:
w = perceptron(40)
erreur de classif
erreur de classif
ok
erreur de classif
erreur de classif
erreur de classif
erreur de classif
ok
erreur de classif
ok
erreur de classif
ok
ok
ok
ok
ok
erreur de classif
ok
ok
ok
erreur de classif
ok
ok
ok
erreur de classif
erreur de classif
ok
ok
ok
ok
ok
ok
ok
ok
erreur de classif
ok
ok
ok
ok
ok

Voici ce que le classifieur a appris

In [174]:
y_pred = array([-1 if dot(w,phi(ex)) <= 0 else 1 for ex in X])

affiche(X,y_pred)